Управление возвращается после “execvp ()”?


if(pid == 0)
{
      execvp(cmd, args);
      // printf("hello"); // apparently, putting this or not does not work.
      _exit(-1);
}
else
{
      // parent process work
}

"execvp ()" заменяет текущую программу to-be-execed программой (конечно, в том же контексте процесса). Так, при помещении, скажем, любого printf () не будут работать вызовы после execvp (). Именно это говорят документы, и я проверил его также.

Но затем, почему _exit () необходим..? Это так происходит, который управление ДЕЙСТВИТЕЛЬНО возвращает execvp сообщения операторов ()?

Я буду благодарен за любые указатели.

Спасибо

6
задан Ajay Garg 19 May 2010 в 07:02
поделиться

4 ответа

Функция вернется в случае сбоя.

Если одна из функций exec возвращается к образу вызывающего процесса, произошла ошибка; возвращаемое значение должно быть -1, а значение errno должно указывать на ошибку.

_exit () позволяет правильно завершить процесс и вернуть код выхода, даже если exec завершился ошибкой.

6
ответ дан 10 December 2019 в 02:43
поделиться

В случае сбоя execvp будет вызван _exit . На странице руководства

execvp сказано:

Возвращаемое значение
Если какая-либо из функций exec () вернется, произойдет ошибка. Возвращаемое значение - -1, а глобальная переменная errno будет установлена ​​для указания ошибки.

1
ответ дан 10 December 2019 в 02:43
поделиться

Следует отметить одно: обычно вы не хотите, чтобы статус выхода процесса был подписан (если важна переносимость). Хотя exec () может вернуть -1 в случае ошибки, он возвращает это значение, чтобы вы могли обработать этот сбой в дочернем коде.

Фактический статус _exit () дочернего элемента должен быть от 0 до 255, в зависимости от того, какая errno была поднята.

0
ответ дан 10 December 2019 в 02:43
поделиться

Системный вызов execve () может завершиться ошибкой. Классическая причина для этого - если файл отсутствует или не является исполняемым. execvp () оборачивается вокруг execve () , чтобы добавить поиск пути и обработку среды по умолчанию (практически всегда то, что вы хотите!), И поэтому он добавляет еще несколько режимов сбоя, в частности, попытку запуска что-то с простым именем, которого нет на пути пользователя. В любом случае сбой - это сбой, и когда это происходит, вы мало что можете сделать, кроме как сообщить, что что-то пошло не так, и получить (теперь бесполезный) дочерний процесс Out Of Dodge. (Самый простой метод сообщения об ошибке - это распечатать сообщение об ошибке, возможно, с помощью perror () , но есть и другие.)

Причина, по которой вам нужен _exit () в отличие от более обычного exit () , заключается в том, что вы хотите выйти из дочернего процесса , но вы не хотят запускать какой-либо зарегистрированный код очистки, связанный с родительским процессом. Хорошо, многое из этого может быть безвредным, но делать такие вещи, как написание прощальных сообщений в сокет или что-то еще, было бы плохо, и часто совсем не очевидно, что было зарегистрировано с помощью atexit () . Позвольте родительскому процессу беспокоиться о своих ресурсах; дочерний элемент в основном не владеет ничем, кроме своего фрейма стека!

2
ответ дан 10 December 2019 в 02:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: