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 сообщения операторов ()?
Я буду благодарен за любые указатели.
Спасибо
Функция вернется в случае сбоя.
Если одна из функций exec возвращается к образу вызывающего процесса, произошла ошибка; возвращаемое значение должно быть -1, а значение errno должно указывать на ошибку.
_exit ()
позволяет правильно завершить процесс и вернуть код выхода, даже если exec завершился ошибкой.
В случае сбоя execvp
будет вызван _exit
. На странице руководства
execvp
сказано:
Возвращаемое значение
Если какая-либо из функций exec () вернется, произойдет ошибка. Возвращаемое значение - -1, а глобальная переменная errno будет установлена для указания ошибки.
Следует отметить одно: обычно вы не хотите, чтобы статус выхода процесса был подписан (если важна переносимость). Хотя exec ()
может вернуть -1 в случае ошибки, он возвращает это значение, чтобы вы могли обработать этот сбой в дочернем коде.
Фактический статус _exit ()
дочернего элемента должен быть от 0 до 255, в зависимости от того, какая errno
была поднята.
Системный вызов execve ()
может завершиться ошибкой. Классическая причина для этого - если файл отсутствует или не является исполняемым. execvp ()
оборачивается вокруг execve ()
, чтобы добавить поиск пути и обработку среды по умолчанию (практически всегда то, что вы хотите!), И поэтому он добавляет еще несколько режимов сбоя, в частности, попытку запуска что-то с простым именем, которого нет на пути пользователя. В любом случае сбой - это сбой, и когда это происходит, вы мало что можете сделать, кроме как сообщить, что что-то пошло не так, и получить (теперь бесполезный) дочерний процесс Out Of Dodge. (Самый простой метод сообщения об ошибке - это распечатать сообщение об ошибке, возможно, с помощью perror ()
, но есть и другие.)
Причина, по которой вам нужен _exit ()
в отличие от более обычного exit ()
, заключается в том, что вы хотите выйти из дочернего процесса , но вы не хотят запускать какой-либо зарегистрированный код очистки, связанный с родительским процессом. Хорошо, многое из этого может быть безвредным, но делать такие вещи, как написание прощальных сообщений в сокет или что-то еще, было бы плохо, и часто совсем не очевидно, что было зарегистрировано с помощью atexit ()
. Позвольте родительскому процессу беспокоиться о своих ресурсах; дочерний элемент в основном не владеет ничем, кроме своего фрейма стека!