Почему программа C может удалить себя и запустить другую задачу? - PullRequest
0 голосов
/ 30 марта 2011
#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("remove %s\n", argv[0]);
    remove(argv[0]);

    printf("rename %s to %s\n", argv[1], argv[2]);
    rename(argv[1], argv[2]);
}


$g++ hello.cpp -o hello
$touch tmp
$./hello tmp temp
remove ./hello
rename tmp to temp

Почему это возможно?

Ответы [ 2 ]

5 голосов
/ 30 марта 2011

По крайней мере, в Unix (включая Linux и Mac OS X), если вы удаляете файл, когда он у кого-то открыт, я фактически не ухожу, пока программа, в которой он был открыт, не закроет файл или не завершит работу.

2 голосов
/ 30 марта 2011

Полагаю, вы спрашиваете не как это сделать (поскольку вы демонстрируете это), а почему это возможно?

Ответ заключается в том, что существует разница между программой на диске (в файле) и программой в памяти.

Когда вы запускаете программу, обычно она копируется в ОЗУ и запускается оттуда, поскольку ЦП имеет прямой доступ только для выполнения операций в ОЗУ. Эта копия концептуально не зависит от файла на диске и может остаться в оперативной памяти, даже если файл будет удален.

Однако некоторые ОС не позволяют удалить файл, если он представляет работающее приложение, например Windows.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...