c - 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()
可以在没有这部分代码的情况下调用,谢谢!
解决方案
根据 C 标准,宏errno
是在 中声明的errno.h
,errno.h
如果你想编写一个使用errno
. 手册页概要告诉你。(这并不是说您需要包含errno.h
才能使用perror
. 有时概要部分会告诉您其他相关的库设施。)
标准中没有任何内容指定errno
宏的定义是什么,或者在实现中您可以找到该定义的扩展引用的任何对象的确切位置。的实现perror
显然需要能够访问errno
所指的任何对象,但由于它不需要是可移植的,因此完全未指定它是如何工作的。
特别是,最近的 C 标准要求对象errno
引用是thread-local,以便每个线程都有自己的errno
对象。(如果不是这种情况,该机制在多线程代码中基本上无法使用。)标准也没有指定线程本地存储的精确实现,并且在特定实现上,它可能映射到由底层操作系统。
推荐阅读
- php - 使用php计算两个lat long之间的距离并以米/公里显示
- python - 打印具有相同列的行
- python - 使用 re.findall() 的模式匹配给出不一致的结果
- java - 如何以编程方式将安卓手机连接到笔记本电脑上的热点设置?
- arduino-esp8266 - ESP 12E 模块 ESP8266 | 无法调用 Https Api。连接失败
- bitrix - Bitrix 自托管 - 找不到页面
- reactjs - 如何在 react-hook-form fieldArray 中保留隐藏字段?
- mysql - 每个单独行的子查询
- asp.net-core - 使用 Asp.Net Core 身份验证时未收到来自 Google 的刷新令牌
- python - 通过切片检测将音频流拆分为文件