実行時に自身(バイナリ)を削除して正常終了するCでプログラムを書くことは可能ですか?もしそうなら、これを行う最も簡単な方法は何ですか?Cで自己破壊的なプログラムを書くことは可能ですか?
答えて
はい。
#include <unistd.h>
int main(int argc, char* argv[])
{
return unlink(argv[0]);
}
(テストおよび作品。)argv[0]
バイナリを指していない場合は(呼び出し側によって書き換えられた)こと
注これは動作しません。 同様に、シンボリックリンクを実行すると、バイナリではなくシンボリックリンクが削除されます。
また、ファイルに複数のハードリンクがある場合、呼び出されたリンクだけが削除されます。
素晴らしい作品 - ありがとう! –
OK、+1して:)。 –
ここでは、バイナリへのパスである 'argv [0]'の信頼性について、通常のビジネスに取り掛かります。 POSIXはバイナリを指すべきであると述べていますが、それを必要とせず、APIによってプログラムがそれを何かに設定できるようになっています。最終的な結果は、通常は動作しますが、信頼性がありません。さらに、正しいパスがあっても、バイナリは複数の場所でハードリンクされている可能性があります。 – dmckee
プログラム内の実行可能ファイル(FILE *など)を削除しようとすることはできますが、その実行可能ファイルが実行されているのが見えるため、動作しない可能性があります。私はそれがあなた自身を食べるのが好きだと思っています。私が知っている限り、それは不可能ですが、確かに私が上記の方法を試してみることができます。
私はそれがあなたが使用しているプラットフォームに依存すると思います。基本的に、実行可能ファイルがロードされると、その後のバイナリへの変更は実行中のプログラムに影響を与えません。 Unixでは、これが該当し、unlinkシステムコールを使用することができます。
これがWindowsでtrueかどうかはわかりません。実行可能イメージを削除することはできません。 WindowsでDeleteFile()APIを試すことができます。
実行中のプログラムで実行中のプログラムが独自のバイナリを削除できる場合は、ファイル削除のためのAPIを探したり、対応するsystem()
コマンドを実行したりしてください。
OSがこれを許可しない場合は、あなたのプログラムは、(のはそれを呼びましょう)(さんがBそれを呼びましょう)別のプログラムを含む、別のバイナリを構築することができます。次に、Aが直ちに終了します。がまだ実行されているとすぐとしてが終了します、BがAのバイナリを消去します場合
プログラムBはチェック単一のループを持っているでしょう。
逆リトルジョン! –
しかし、Bについては、二重の自殺が間違っているようなものです。 –
さて、使命はAを殺すことでしたか? Bは一時フォルダ内に休み、いつか掃除を待つことができます。 – Imp
私は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]);
}
どのように近いですそれはあなたが望むものですか?
- 1. data.frameをインプレースで(破壊的に)変更することは可能ですか?
- 2. なぜListAppendは破壊的ではなく、ArrayAppendとStructInsertは両方とも破壊的ですか?
- 3. アンドロイドスタジオでプレーンjava/C++プログラムを書くことは可能ですか?
- 4. Coqを使ってCプログラムを書くことは可能ですか?
- 5. Javaの破壊的で非破壊的なメソッドとは何ですか?
- 6. vb.netやC#でアセンブリコードを書くことは可能ですか?
- 7. 自己増分アレイ破壊? Node.jsの
- 8. PHP - 自己破壊のメッセージ電報ボット
- 9. Scalaで入力パラメータを破壊することは可能ですか?
- 10. Javaで自己更新プログラムを書くには?
- 11. Cythonに「純粋な」C++クラスを書くことは可能ですか?
- 12. オブジェクトは自分自身を破壊することができますか? (Java)
- 13. PHPで表示された後の自己破壊電子メール
- 14. CでiPhoneのプログラムを書くことはできますか?
- 15. プログラムで非破壊的なブリーダーを追加する
- 16. 自己実行機能はDOMで実行可能ですか?
- 17. nwjsアプリの自動化テストを書くことは可能ですか?
- 18. Pythonでクローズドソースのアンドロイドプログラムを書くことは可能ですか?
- 19. javascriptで剃刀コードを書くことは可能ですか?
- 20. JavaScriptでWebクローラを書くことは可能ですか?
- 21. AWKで言語パーサーを書くことは可能ですか?
- 22. JSchemeでJavaクラスを書くことは可能ですか?
- 23. ロケールで成功メッセージを書くことは可能ですか?
- 24. angular2でプログラム的に "self"コンポーネントを破壊する方法は?
- 25. 目的のCとスピーディの両方でiPhoneアプリを書くことは可能ですか?
- 26. 閲覧後に自己破壊するWebページをコード
- 27. 関数型プログラミングと自己コメントコード - これは本当に可能ですか?
- 28. 海底で壊れた軸グラフを描くことは可能ですか?
- 29. C#では、ブラウザを開くことなく、バックグラウンドでURLを開くことは可能ですか?
- 30. ループするMySQLクエリを書くことは可能ですか?
.exeファイルを削除するプログラムを書くことはおそらく可能ですが、いくつかの環境でOSが実行中に.exeをロックするため、いくつかのフープを飛び越す必要があるかもしれません。 –