Почему любая вещь, которая появляется после execvp или семейства функций exec*, не будет выполнена?
Так что я знаю, что все, что приходит после exec*
функции не будут выполнены (конечно, если вызов exec* успешен).
Я хочу понять, почему это так? Итак, я разработал эту крошечную маленькую программу
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
printf("A program made to understand execvp\n");
char *cmd[4] = {"ls", "-l","file",NULL};
execvp(cmd[0],cmd);
printf("This will not be printed!!\n");
return 0;
}
Что я понимаю, так это то, что исполняемые команды, подобные тем, которые находятся в каталоге bin, на самом деле являются исполняемыми программами, и поэтому при вызове другой программы из нашей программы.
И я где-то читал, что
в случае успеха системные вызовы exec не возвращаются в вызывающую программу, поскольку вызывающий образ теряется.
Но что это действительно означает, и почему они не возвращаются в вызывающую программу? Как они возвращаются тогда?
1 ответ
Вы сказали "в основном вызывайте другую программу из нашей программы", но это не совсем верно.
Если вы хотите вызвать другую программу из вашей программы, вы можете использовать system()
,
Но если вы используете exec
семья, то, что они делают, это заменяют вашу программу другой программой. Забейте вашу программу другой программой. Перезаписать вашу программу другой программой.
однажды exec
успешно перезаписывает вашу программу этой другой программой, не осталось и следа вашей программы для возврата.
Это все из-за концепции процесса. Когда вы звоните system()
он создает новый процесс для запуска этой другой программы, а когда другой процесс завершается, он может вернуться к исходной программе в исходном процессе.
Но exec
не создает новый процесс - он использует оригинальный.