首页 > 解决方案 > perror 手册页中的 SYNOPSIS 部分是什么意思?

问题描述

perror手册页中的 SYNOPSIS 部分是:

   #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) */

根据手册页规范,SYNOPSIS 部分表明

对于函数,它显示任何必需的数据声明或#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不包含header,那么这段代码是如何触发errno修改的呢?

SYNOPSIS 部分的含义是什么#include <errno.h> ... int errno;?似乎perror()可以在没有这部分代码的情况下调用,谢谢!

标签: cerrno

解决方案


根据 C 标准,宏errno是在 中声明的errno.herrno.h如果你想编写一个使用errno. 手册页概要告诉你。(这并不是说您需要包含errno.h才能使用perror. 有时概要部分会告诉您其他相关的库设施。)

标准中没有任何内容指定errno宏的定义是什么,或者在实现中您可以找到该定义的扩展引用的任何对象的确切位置。的实现perror显然需要能够访问errno所指的任何对象,但由于它不需要是可移植的,因此完全未指定它是如何工作的。

特别是,最近的 C 标准要求对象errno引用是thread-local,以便每个线程都有自己的errno对象。(如果不是这种情况,该机制在多线程代码中基本上无法使用。)标准也没有指定线程本地存储的精确实现,并且在特定实现上,它可能映射到由底层操作系统。


推荐阅读