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