После возврата execvp, почему моя программа не начинает с того места, где остановилась? - PullRequest
4 голосов
/ 18 марта 2009

У меня есть такой блок кода, который работает как дочерний поток:

if(someVar == 1){
doSomeStuff;

_exit(0)
}
else
   execvp(*(temp->_arguments), temp->_arguments);
printf("I'm done\n");

Когда я запускаю программу с someVar == 1, я понимаю, что вызов _exit (0) убивает мой поток. Однако, когда он установлен в 0, почему программа не продолжает работу после вызова execvp () и не выполняет оператор printf?

Ответы [ 3 ]

7 голосов
/ 18 марта 2009

Если вы exec* (вызываете любую функцию exec из семейства exec), тогда код новой программы загружается в ваш текущий процесс, и выполнение продолжается с его основной функцией и ее содержимым. При успешном выполнении этих функций они никогда не вернутся, потому что ваш printf больше не существует в памяти.

Я думаю, вы путаете exec* с функцией fork. Это склеит новый дочерний процесс, который будет выполнять тот же код, что и родительский.

Если вам нужно создать новый поток, который делит данные и адресное пространство с основным потоком, вам следует использовать функцию pthread_create. Новый процесс не будет обмениваться данными, и вам придется общаться с другим процессом, используя другие механизмы, такие как каналы или разделяемая память.

2 голосов
/ 18 марта 2009

потому что execvp заменяет процесс, который вы выполняли процессом, который вы exec 'редактировали Если execvp возвращается, это потому, что это не удалось. Иначе не должно возвращаться.

2 голосов
/ 18 марта 2009

execvp () перезаписывает вашу программу новым исполняемым файлом и не возвращается, если не произошла ошибка. Вам нужно сначала fork () , а затем вызвать exec * для дочернего процесса.

...