【问题标题】:What is the difference between the various unistd.h under /usr/include in Linux?Linux中/usr/include下的各种unistd.h有什么区别?
【发布时间】:2010-06-01 09:46:14
【问题描述】:

在 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 规范中只有一个该文件的定义?

提前致谢。

【问题讨论】:

    标签: c linux


    【解决方案1】:

    linux/unistd.h 实际上指向asm/unistd.h,而asm/unistd.h 又指向asm/unistd_32.hasm/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
    

    本质上,POSIX 唯一需要的标头实际上就是unistd.h,其余的要么是扩展,要么是来自内核的定义。因此,只需包括unistd.h 就是您所要做的全部事情,您需要的所有内容都将根据您的架构和您选择的任何构建选项被拉入。

    【讨论】:

      【解决方案2】:

      这是 C 和 C++ 中的一种常用技术 - 您在“标准”位置有一个带有“标准”名称的文件,在本例中为 ./unistd.h,然后让该文件包含一个或多个特定于实现的文件文件,取决于预处理器宏。如果您查看几乎所有“标准”C 或 C++ 头文件,您会看到它包括任何标准中未提及的其他文件。

      【讨论】:

        【解决方案3】:

        基本上将/usr/include/unistd.h 视为一个智能符号链接。它将根据您的操作条件指向正确的实现。

        也就是说,有时很难弄清楚正确的实现是什么。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-18
          • 1970-01-01
          • 2015-03-25
          • 2011-05-06
          相关资源
          最近更新 更多