Раздел СИНТАКСИС на справочной странице perror
:
#include <stdio.h>
void perror(const char *s);
#include <errno.h>
const char * const sys_errlist[];
int sys_nerr;
int errno; /* Not really declared this way; see errno(3) */
согласно спецификации справочной страницы, в разделе СИНТАКСИС указано, что
Для функций он показывает все необходимые объявления данных или директивы #include, за которыми следует объявление функции.
Следующий код:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *ls_args[2] = {"nonsense", NULL};
execv(ls_args[0], ls_args); // no return
perror("execve failed");
return 2;
}
выводит сообщение об ошибке execve failed: No such file or directory
, при этом соответствующее errno
равно 2
поскольку errno
является глобальной переменной (фактически макросом), определенной в errno.h
, а заголовок errno.h
не включен, как этот код запускает модификацию errno
?
Что означает #include <errno.h> ... int errno;
в разделе ОБЗОР? похоже, что perror()
можно вызвать и без этой части кода, спасибо!
perror
, а включение errno.h даст вам объявленияsys_nerr
иerrno
. Образец кода не ссылается ни на один из двух файлов из errno.h. - person William Pursell   schedule 28.02.2020#include<errno.h> ...
включена в синопсисperror()
, если для вызоваperror()
это вообще не требуется, спасибо! - person mzoz   schedule 28.02.2020sys_nerr
илиerrno
- person William Pursell   schedule 28.02.2020errno
изменения за кулисами, учитывая, что он не включен в первую очередь - person mzoz   schedule 28.02.2020errno
определяется стандартом ISO C как изменяемое lvalue типаint
и не должно быть явно объявлено;errno
может быть макросом.errno
этоthread-local
; установка его в одном потоке не влияет на его значение в любом другом потоке. (отman 3 errno
) - person David C. Rankin   schedule 28.02.2020errno
? Значениеerrno
может быть записано/прочитано любой функцией, выполняемой потоком. Это означает, чтоexecv
может и меняет его, когда что-то идет не так. Кстати, комментарийno return
верен только тогда, когдаexecv
завершается успешно. Когдаexecv
дает сбой, он действительно возвращается после записи кода ошибки вerrno
. - person user3386109   schedule 28.02.2020execv
объявлен вunistd.h
, который не пересекается сerrno.h
, как он может получить доступ и изменитьerrno
? Я также читал, чтоerrno
можно модифицировать библиотечными функциями, просто любопытно, как это реализовано. - person mzoz   schedule 28.02.2020execv()
илиperror()
, содержит#include <errno.h>
, поэтому он может использоватьerrno
. Точно так же, как в вашем коде. - person Jonathan Leffler   schedule 28.02.2020include
есть только файлы заголовков - person mzoz   schedule 28.02.2020perror()
иexecv()
. - person Jonathan Leffler   schedule 28.02.2020include
должен содержать только заголовки (и подкаталоги, содержащие больше заголовков и подкаталогов). Так и должно быть. Ваш компилятор связывает ваш код с предварительно скомпилированной библиотекой (например,glibc
), которая содержит объектный код для всех функций, которые вы можете вызывать из системной библиотеки. - person Jonathan Leffler   schedule 28.02.2020