実行時にそれ自体(バイナリ)を削除してから正常に終了するプログラムをCで作成することは可能ですか?もしそうなら、これを行う最も簡単な方法は何ですか?
5 に答える
はい。
#include <unistd.h>
int main(int argc, char* argv[])
{
return unlink(argv[0]);
}
(テスト済みで動作します。)
argv[0]
(呼び出し元によって書き換えられた)バイナリを指していない場合、これは機能しないことに注意してください。同様に、シンボリックリンクを実行すると、バイナリではなくシンボリックリンクが削除されます。
また、ファイルに複数のハードリンクがある場合は、呼び出されたリンクのみが削除されます。
本当にプラットフォームに依存しない方法で便利に実行できるかどうかはわかりませんが、プラットフォームに依存しないように指定していないので、次のLinuxスタイルのコードを試してください。
#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv) {
printf("Read carefully! You cannot print this message again.\n");
return unlink(argv[0]);
}
それはあなたが望むものにどれくらい近いですか?
オペレーティングシステムが実行中のプログラムに独自のバイナリの削除を許可している場合は、ファイル削除用のAPIを探すか、対応するsystem()
コマンドを実行します。
OSがこれを許可しない場合、プログラム(Aと呼びましょう)は、別のプログラム( Bと呼びましょう)を含む別のバイナリを構築できます。その後、Aはすぐに終了します。
プログラムBは、 Aがまだ実行されているかどうかをチェックする単一のループを持ち、Aが終了するとすぐに、 BはAのバイナリを消去します。
プログラム内の実行可能ファイル(FILE *など)を削除することもできますが、実行中の実行可能ファイルであるため、機能しない可能性があります。自分で食べるようなものだと思いますし、それは不可能だと思いますが、上記の方法で試してみてはいかがでしょうか。
使用しているプラットフォームによって異なると思います。基本的に、実行可能ファイルがロードされると、その後のバイナリへの変更は実行中のプログラムに影響を与えません。Unixでは、これが当てはまり、unlinkシステムコールを使用できます。
これがWindowsに当てはまるかどうかはわかりません。実行可能イメージを削除できない場合があります。WindowsでDeleteFile()APIを試すことができます。