2012-04-01 5 views
9

実行時に自身(バイナリ)を削除して正常終了するCでプログラムを書くことは可能ですか?もしそうなら、これを行う最も簡単な方法は何ですか?Cで自己破壊的なプログラムを書くことは可能ですか?

+3

.exeファイルを削除するプログラムを書くことはおそらく可能ですが、いくつかの環境でOSが実行中に.exeをロックするため、いくつかのフープを飛び越す必要があるかもしれません。 –

答えて

15

はい。

#include <unistd.h> 
int main(int argc, char* argv[]) 
{ 
    return unlink(argv[0]); 
} 

(テストおよび作品。)argv[0]バイナリを指していない場合は(呼び出し側によって書き換えられた)こと

注これは動作しません。 同様に、シンボリックリンクを実行すると、バイナリではなくシンボリックリンクが削除されます。

また、ファイルに複数のハードリンクがある場合、呼び出されたリンクだけが削除されます。

+0

素晴らしい作品 - ありがとう! –

+0

OK、+1して:)。 –

+5

ここでは、バイナリへのパスである 'argv [0]'の信頼性について、通常のビジネスに取り掛かります。 POSIXはバイナリを指すべきであると述べていますが、それを必要とせず、APIによってプログラムがそれを何かに設定できるようになっています。最終的な結果は、通常は動作しますが、信頼性がありません。さらに、正しいパスがあっても、バイナリは複数の場所でハードリンクされている可能性があります。 – dmckee

0

プログラム内の実行可能ファイル(FILE *など)を削除しようとすることはできますが、その実行可能ファイルが実行されているのが見えるため、動作しない可能性があります。私はそれがあなた自身を食べるのが好きだと思っています。私が知っている限り、それは不可能ですが、確かに私が上記の方法を試してみることができます。

0

私はそれがあなたが使用しているプラ​​ットフォームに依存すると思います。基本的に、実行可能ファイルがロードされると、その後のバイナリへの変更は実行中のプログラムに影響を与えません。 Unixでは、これが該当し、unlinkシステムコールを使用することができます。

これがWindowsでtrueかどうかはわかりません。実行可能イメージを削除することはできません。 WindowsでDeleteFile()APIを試すことができます。

2

実行中のプログラムで実行中のプログラムが独自のバイナリを削除できる場合は、ファイル削除のためのAPIを探したり、対応するsystem()コマンドを実行したりしてください。

OSがこれを許可しない場合は、あなたのプログラムは、(のはそれを呼びましょう)(さんがBそれを呼びましょう)別のプログラムを含む、別のバイナリを構築することができます。次に、Aが直ちに終了します。がまだ実行されているとすぐとしてが終了します、BAのバイナリを消去します場合

プログラムBはチェック単一のループを持っているでしょう。

+1

逆リトルジョン! –

+3

しかし、Bについては、二重の自殺が間違っているようなものです。 –

+1

さて、使命はAを殺すことでしたか? Bは一時フォルダ内に休み、いつか掃除を待つことができます。 – Imp

5

私は1つの便利な真のプラットフォームに依存しない方法でそれを行うことができますが、プラットフォームの独立性を指定し、その次、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]); 
} 

どのように近いですそれはあなたが望むものですか?

+9

これは、私が今まで見たmain()の引数のうちでもっともワイドな型付けです。 – blueshift

+0

Woow。できます。この引数の型について説明できますか? – Jack

+1

これは偶然にも 'main'に対する非標準の引数です。それを考えると、あなたのサンプルコードを新人が理解するのをより困難にするために役立ちます... –

関連する問題