Можно ли написать программу на C, которая после выполнения удаляет себя (двоичную), а затем успешно завершает работу. Если да, то какой самый простой способ сделать это?Можно ли написать саморазрушительную программу в C?
ответ
Да.
#include <unistd.h>
int main(int argc, char* argv[])
{
return unlink(argv[0]);
}
(Протестировано и работает.)
Примечание, что если argv[0]
не указывает на двоичный файл (переписан вызывающему) это не будет работать. Аналогично, если запустить через символическую ссылку, то символическая ссылка, а не двоичная, будет удалена.
Также, если файл содержит несколько жестких ссылок, удаляется только связанная ссылка.
Отлично работает - спасибо! –
Хорошо, +1 то :). –
Здесь мы получаем обычное дело о надежности 'argv [0]' как пути к двоичному. POSIX говорит, что * должен * указывать на двоичный файл, но не требует его, и API позволяет программам устанавливать его на что-то другое. В конечном итоге это обычно работает, но не является надежным. Более того, даже если у вас есть правильный путь, двоичный файл может быть жестко привязан в нескольких местах. – dmckee
Вы можете попытаться просто удалить исполняемый файл в программе (FILE * и т. Д.) ... но видя, что этот исполняемый файл запускается, он может не работать. Я вижу, что это нравится есть, и, насколько я знаю, это невозможно, но вы могли бы попробовать попробовать, используя метод, упомянутый выше.
Я думаю, что это зависит от платформы, которую вы используете. В принципе, после загрузки исполняемого файла любое последующее изменение двоичного файла не влияет на запущенную программу. В Unix это так, и вы можете использовать системный вызов unlink.
Я не уверен, верно ли это для Windows или нет. Невозможно удалить исполняемый образ. Вы можете попробовать DeleteFile() api в Windows.
Если вы используете операционную систему для запуска своей программы, то просто найдите API для удаления файла или выполните соответствующую команду system()
.
Если операционная система не позволяет этого, ваша программа (назовем ее ) может построить другой двоичный файл, содержащий другую программу (назовем его B). Затем A немедленно прекратит работу.
Программа Б бы проверку, если все еще работает, и как только A завершает работу B бы стереть бинарного «ы одну петлю.
Обратный Маленький Джон! –
Но как насчет B - это похоже на двойное самоубийство. –
Ну, миссия заключалась в том, чтобы убить А, не так ли? B может отдыхать в какой-то временной папке и ждать, когда ее уберут. – Imp
Я не знаю, что один может удобно сделать это действительно независимым от платформы способом, но вы не указали независимость от платформы, поэтому попробуйте следующий, код 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]);
}
Как близко это то, что вы хотите?
Это наихудшая типизация аргументов main(), которую я когда-либо видел. – blueshift
Woow. Оно работает. Можете ли вы объяснить эти типы аргументов? – Jack
Это нестандартные аргументы для 'main', кстати. Учитывая это, он служит только для того, чтобы ваш примерный код стал более трудным для новичков, чтобы понять ... –
- 1. Можно ли написать программу без переменных в C#?
- 2. Можно ли написать одну программу с тремя языками программирования?
- 3. Можно ли написать гибкий Pimpl в C++?
- 4. Можно ли написать код C# в salesforce?
- 5. Можно ли включить скрипт оболочки в программу C
- 6. Можно ли написать программу, чтобы получить результат онлайн-поиска?
- 7. Можно ли написать программу для взаимодействия с существующим программным обеспечением?
- 8. Можно ли написать программу, которая использует разные SDK-s?
- 9. Можно ли написать многоплатформенную программу, которая не написана на Java
- 10. Можно ли написать код, чтобы написать код?
- 11. Попытка написать программу стека C++
- 12. Написать 64-разрядную программу в C
- 13. Можно ли написать следующее как макрос C++?
- 14. Можно ли написать функцию C++, которая строит?
- 15. Можно ли написать программу C/C++, которая передает java-классы JVM?
- 16. Как написать программу на C, соответствующую требованиям
- 17. Можно ли это написать?
- 18. Я пытаюсь написать первую программу # в C++
- 19. Как написать программу эха в C?
- 20. Как написать программу фильтрации в C?
- 21. Можно ли написать ядра OpenCL в C++, а не C?
- 22. Можно ли написать расширение node.js в C (не C++)?
- 23. Можно ли запускать программу (java \ c \ etc) в этих ситуациях?
- 24. Можно ли скомпилировать программу без файла .c в файле make?
- 25. Можно ли написать ROT13 в одной строке?
- 26. Можно ли написать программу на C, которая ничего не делает - даже не занимая память?
- 27. Можно ли написать программу на C, которая может установить MSL для UDP-пакета?
- 28. как написать программу
- 29. Можно ли написать/написать openstreetmap (osm) routeplanner?
- 30. Как лучше написать эту программу на C++
Возможно, возможно написать программу, которая удалит файл .exe или что-то еще, хотя вам, возможно, придется перепрыгнуть через некоторые обручи, так как в некоторых средах ОС блокирует файл .exe во время его выполнения. –