在Linux下的/ usr / include目录下,我输入了命令: find -type f -name unistd.h,它给出了以下输出:
./ unistd.h中 ./linux/unistd.h ./asm-generic/unistd.h ./bits/unistd.h ./asm/unistd.h ./sys/unistd.h
我的问题是,每个unistd.h的目的是什么,因为单个unix规范中只有一个该文件的定义?
提前致谢。
答案 0 :(得分:9)
linux/unistd.h
实际上指向asm/unistd.h
,asm/unistd_32.h
又指向asm/unistd_64.h
或bits/unistd.h
,这是系统调用号码定义并呈现给用户空间的位置,具体取决于系统的架构。这些来自内核。
unistd.h
是一个扩展/* Define some macros helping to catch buffer overflows. */
#if __USE_FORTIFY_LEVEL > 0 && defined __extern_always_inline
# include <bits/unistd.h>
#endif
的宏集合(主要用于帮助防止缓冲区溢出),它通过以下方式有条件地包括在内:
unistd.h
实质上,唯一需要POSIX的标头实际上只是unistd.h
,其余的是扩展或内核定义。因此,只需包含{{1}}就可以了解所有内容,根据您的体系结构和您选择的任何构建选项,您需要的所有内容都会被提取。
答案 1 :(得分:4)
这是C和C ++中的常用技术 - 在“标准”位置有一个带有“标准”名称的文件,在本例中为./unistd.h,然后让该文件包含一个或多个特定于实现的文件文件,取决于预处理器宏。如果您查看几乎所有“标准”C或C ++头文件,您将看到它包括任何标准中未提及的其他文件。
答案 2 :(得分:0)
基本上认为/usr/include/unistd.h
是一个明智的符号链接。根据您的操作条件,它将指向正确的实施。
也就是说,有时候很难弄清楚正确的实现是什么。