是否可以用C編寫一個程序,在執行時刪除自身(二進制文件),然後成功終止。如果是這樣,做這件事最簡單的方法是什麼?是否可以用C編寫一個自毀程序?
回答
是的。
#include <unistd.h>
int main(int argc, char* argv[])
{
return unlink(argv[0]);
}
(測試和工程。)
注意,如果argv[0]
沒有指向二進制(由主叫改寫),這是不行的。 同樣,如果通過符號鏈接運行,則符號鏈接,而不是二進制文件將被刪除。
此外,如果文件有多個硬鏈接,只有被調用的鏈接將被刪除。
很好用 - 謝謝! – 2012-04-01 14:36:47
好吧,+1然後:)。 – 2012-04-01 14:37:10
在這裏,我們進入關於'argv [0]'的可靠性作爲二進制路徑的常見業務。 POSIX說* *應該指向二進制文件,但不需要它,API允許程序將其設置爲其他內容。最終的結果是,這通常有效,但不可靠。而且,即使您有正確的路徑,二進制文件也可能在多個地方被硬鏈接。 – dmckee 2012-04-01 14:48:17
你可以嘗試只刪除程序(FILE *和東西)可執行......但看到該可執行文件是真實中運行它可能無法正常工作。我認爲它就像吃自己一樣,據我所知這不可能,但你可以嘗試使用我上面提到的方法。
我認爲這取決於您使用的平臺。基本上,一旦加載可執行文件,對二進制文件的任何後續更改都不會影響正在運行的程序。在Unix中,情況就是這樣,你可以使用unlink系統調用。
我不確定這是否在Windows上是正確的。可能不允許刪除可執行映像。您可以嘗試Windows中的DeleteFile()api。
如果操作系統允許運行的程序來刪除自己的二進制文件,然後就找了文件刪除的API,或執行相應的命令system()
。
如果操作系統不允許這樣,你的程序(我們稱之爲一個)可以構建另一個二進制,包含另一個程序(我們稱之爲乙)。然後,A會立即退出。
計劃乙將有一個循環檢查,如果一個仍在運行,並儘快一個退出,乙將刪掉一個的二進制文件。
反向小約翰! – 2012-04-01 14:45:18
但是B怎麼樣 - 就像雙重自殺出了問題。 – 2012-04-01 14:46:57
呃,這個任務是要殺A,不是嗎? B可以放在某個臨時文件夾中,等待某個時間被清除。 – Imp 2012-04-01 14:48:48
我不知道,一個可以方便做一個真正的平臺無關的方式,但你沒有指定平臺的獨立性,所以嘗試以下方法,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. 是否可以編寫一個將Java類提供給JVM的C/C++程序?
- 2. 是否可以使用三種編程語言編寫一個程序?
- 3. 是否可以編寫一個可與Arduino板通信的Android應用程序?
- 4. 我可以自己編寫一個應用程序 - Xcode/iOS嗎?
- 5. 是否可以編寫一個使用Unicode的優秀PHP應用程序?
- 6. MIFARE智能卡是否可編程,我可以編寫一個他們可以執行的程序?
- 7. 是否可以用C++而不是C編寫OpenCL內核?
- 8. 是否有可能在C#中爲Android編寫應用程序?
- 9. 是否可以用Java編寫NetLogo仿真程序?
- 10. 是否可以在Web應用程序中編寫文件?
- 11. 是否可以編寫安裝CA的iOS應用程序?
- 12. 編寫一個C#.NET應用程序可以調用的C++ DLL?
- 13. 是否可以在不使用頭文件的情況下編寫c程序
- 14. 是否可以編寫一個程序來獲取在線搜索結果?
- 15. 是否可以使用c#編寫a = b == c?
- 16. 是否可以在C++中編寫通用可變參數zipWith?
- 17. 程序員可以用C++編寫多少個嵌套結構?
- 18. 是否可以編寫一個通用重新綁定模板?
- 19. 編寫一個C程序,以使用用於循環
- 20. 是否可以在C(而不是C++)中編寫node.js擴展?
- 21. 是否可以爲java卡編寫驅動程序
- 22. 是否可以使用javascript函數只編寫一個可編輯的textarea?
- 23. 是否有它可以產生一個有效的C程序
- 24. EEPROM是否可以一次編程?
- 25. 是否可以採用一個流程?
- 26. 我可以下載一個用C#編寫的程序到nxt 2.0磚嗎?
- 27. 是否可以編寫批處理C#編譯器?
- 28. 是否可以在Libgdx中編寫C/C++代碼?
- 29. 是否可以使用C++編寫自定義的轉換運算符(如`static_cast`)?
- 30. 是否可以爲XAttribute和XElement編寫一個方法?
可能編寫一個程序刪除.exe文件或其他任何東西,儘管您可能需要跳過一些環節,因爲在某些環境中,操作系統在執行時會鎖定.exe。 – 2012-04-01 14:34:44