Почему функции семейства exec() на самом деле возвращают значение?

В книге о программировании для 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 не будет достаточно?

  • Это просто для того, чтобы соответствовать общему методу/практике всегда проверять возвращаемые значения или имеет другую цель?


Связанный:


person RobertS supports Monica Cellio    schedule 21.05.2020    source источник
comment
Совместимость с другими системными вызовами?   -  person Shawn    schedule 21.05.2020
comment
Да, возврат функции exec* является достаточным признаком ошибки. Я предполагаю, что эти функции возвращают int по историческим причинам, поскольку int раньше был неявным типом значения для старых функций C, а возвращаемый тип void не существовал в течение нескольких лет, когда C уже использовался для реализации UNIX.   -  person PSkocik    schedule 21.05.2020
comment
@PSkocik Это было еще до C89/C90. Не нужно подгонять функции под стандарт? Или это для совместимости с предстандартными системами C?   -  person RobertS supports Monica Cellio    schedule 21.05.2020
comment
Насколько мне известно, первые стандарты буквально обещали совместимость и кодификацию существующих практик, а не разработку комитетом. (Последние стандарты нарушают последнее обещание все больше и больше.)   -  person PSkocik    schedule 21.05.2020