В книге о программировании для Linux и Unix я нашел следующее утверждение (выделение мое):
"Все функции (
exec()
-семейства) возвращают-1
в случае ошибки. В противном случае при успешном выполнении нет возврата обратно в вызывающую программу. Таким образом, проверка возврата является избыточной значение; вы можете сразу продолжить процедуру обработки ошибок."
Кажется, это соответствует соответствующей справочной странице Linux:
"ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ. Функции
exec()
возвращают значение только в случае возникновения ошибки. Возвращаемое значение –-1
, аerrno
указывает на ошибку."
Таким образом, если текущий образ процесса был успешно заменен новым образом процесса, возврата быть не должно. Только если произошла ошибка при создании нового образа, одна из exec()
-функций действительно возвращает (-1
).
Означает, в свою очередь, вместо, напр.:
if ( execl("/bin/foo", "foo", "bar", (char *) NULL) == -1 )
{
perror("Execution of foo failed");
// further error routine.
}
Можно просто сделать:
execl("/bin/foo", "foo", "bar", (char *) NULL);
perror("Execution of foo failed");
// further error routine.
Но почему функции
exec()
-семейства имеют возвращаемое значение тогда вообще, если дальнейшее выполнение программы вызывающего уже указывает на то, что произошла ошибка?Разве простого оператора
return;
в конце функций и соответствующего возвращаемого типаvoid
не будет достаточно?Это просто для того, чтобы соответствовать общему методу/практике всегда проверять возвращаемые значения или имеет другую цель?
Связанный:
exec*
является достаточным признаком ошибки. Я предполагаю, что эти функции возвращаютint
по историческим причинам, посколькуint
раньше был неявным типом значения для старых функций C, а возвращаемый тип void не существовал в течение нескольких лет, когда C уже использовался для реализации UNIX. - person PSkocik   schedule 21.05.2020