Можно ли написать программу на C, которая при выполнении удаляет себя (двоичный файл), а затем успешно завершается. Если да, то как проще всего это сделать?
Можно ли написать саморазрушающуюся программу на C?
Ответы (5)
да.
#include <unistd.h>
int main(int argc, char* argv[])
{
return unlink(argv[0]);
}
(Проверено и работает.)
Обратите внимание: если argv[0]
не указывает на двоичный файл (переписанный вызывающей стороной), это не сработает. Точно так же, если запустить через символическую ссылку, тогда символическая ссылка, а не двоичный файл, будет удалена.
Также, если файл имеет несколько жестких ссылок, будет удалена только вызываемая ссылка.
argv[0]
как пути к бинарнику. POSIX говорит, что должен указывать на двоичный файл, но не требует этого, и API позволяет программам устанавливать его на что-то другое. Конечным результатом является то, что это обычно работает, но ненадежно. Более того, даже если у вас есть правильный путь, двоичный файл может быть жестко связан более чем в одном месте.
- person dmckee --- ex-moderator kitten; 01.04.2012
/proc
.
- person dmckee --- ex-moderator kitten; 01.04.2012
unlink
- это POSIX, а не часть требования.
- person Jens Gustedt; 01.04.2012
Я не знаю, можно ли удобно сделать это действительно независимым от платформы способом, но вы не указали независимость от платформы, поэтому попробуйте следующий код в стиле 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
. Учитывая это, это только усложнит понимание вашего примера кода для новичка...
- person Oliver Charlesworth; 01.04.2012
-Wall
и -Wextra
, выдает предупреждение, если я не могу поставить перед int argc
__attribute__((unused))
в этом конкретном примере. Причина, конечно же, в том, что argc
здесь не используется.]
- person thb; 01.04.2012
T**
нельзя преобразовать в const T**
, поэтому лучше не смешивать их.
- person Oliver Charlesworth; 01.04.2012
Если ваша операционная система позволяет запущенной программе удалять свой собственный двоичный файл, то просто найдите API для удаления файлов или выполните соответствующую команду system()
.
Если ОС этого не позволяет, ваша программа (назовем ее A) может создать другой двоичный файл, содержащий другую программу (назовем ее B). Затем A немедленно уходил.
Программа B будет иметь один цикл, проверяющий, работает ли A, и как только A завершает работу, B стереть двоичный файл A.
Вы можете попытаться просто удалить исполняемый файл в программе (ФАЙЛ* и прочее)... но, поскольку этот исполняемый файл запускается, это может не сработать. Я вижу это как поедание самого себя, и, насколько я знаю, это невозможно, но вы, безусловно, можете попробовать, используя метод, который я упомянул выше.
Я думаю, что это зависит от платформы, которую вы используете. По сути, после загрузки исполняемого файла любое последующее изменение двоичного файла не влияет на работающую программу. В Unix это так, и вы можете использовать системный вызов unlink.
Я не уверен, верно ли это для Windows или нет. Удаление исполняемого образа может быть запрещено. Вы можете попробовать API DeleteFile() в Windows.