【问题标题】:sigaction System Callsigaction 系统调用
【发布时间】:2012-01-27 11:42:57
【问题描述】:

我正在查看 sigaction 的手册页,最后我看到了以下行。

sigaction(): _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCE

_POSIX_X_SOURCE、_X_OPEN_SOURCE、_POSIX_SOURCE 是什么意思?怎么办?

【问题讨论】:

    标签: c linux macros posix signals


    【解决方案1】:

    这些是功能测试宏。它们的目的是让您的程序通知系统头文件您希望它尝试符合哪些标准,以及您希望哪些扩展可用。

    在没有定义任何功能测试宏的情况下,实现会在它们在标题中显示的宏、函数和类型定义方面存在很大差异。一种常见的做法是默认使 everything 可见,这是一个问题,因为“everything”不是很具体,而且程序中使用的符号名称很可能与某些扩展名发生冲突。即使他们现在不发生冲突,也不知道他们将来是否会发生冲突。因此,标准(如 ISO C 和 POSIX)对实现提出了严格的要求,即它不会污染标准中未明确定义或保留的名称的应用程序命名空间。当您使用功能测试宏请求特定标准时,您要求实现确保(1)它提供该标准中定义的所有内容,(2)它不会通过提供任何未定义的内容来污染您的应用程序的命名空间那个标准。

    一个正确的程序应该始终明确地为它所写入的标准使用正确的功能测试宏。最简单的方法是将正确的 -D 参数放在编译器命令行 (CFLAGS) 上。添加#define 作为每个源文件的第一行也可以。请注意,如果您在源文件中执行此操作:

    1. 必须在顶部在包含任何系统标头之前定义功能测试宏
    2. 在不同的翻译单元中使用不同的功能测试宏通常是个坏主意。

    顺便说一句,它与其他功能测试宏并不完全相同,但所有现代程序在 Linux/glibc 上构建时都应定义 _FILE_OFFSET_BITS=64 以请求 off_t 为 64 位以支持大文件。

    【讨论】:

      【解决方案2】:

      这是一个功能宏的人:http://www.kernel.org/doc/man-pages/online/pages/man7/feature_test_macros.7.html

      它们会在标头中打开或关闭某种程度的标准支持。

      例如_POSIX_C_SOURCE >= 1 表示应支持 POSIX.2-1992 或更高版本; _X_OPEN_SOURCE 表示启用了 POSIX.1、POSIX.2 和 XPG4;对于更大的宏值 (>=500; >=600; >=700),它还将打开 SUSv2 v3 或 v4 (UNIX 98; 03 或 POSIX.1-2008+XSI) 的某些变体。 _POSIX_SOURCE 是定义 _POSIX_C_SOURCE = 1 的过时方法

      【讨论】:

        【解决方案3】:

        它们是您必须通过#define 获得原型的东西,它们被称为feature test macros

        例如,以下代码将成功定义sigaction 的原型:

        #define _XOPEN_SOURCE
        #include <signal.h>
        

        包括signal.h 没有 #define(或其他)不会定义原型。

        【讨论】:

          【解决方案4】:

          这是一个Feature test macro.

          称为“功能测试宏”的符号用于控制可能包含在标头中的符号的可见性。 IEEE Std 1003.1-2001 的实现、未来版本和其他标准可能会定义额外的功能测试宏。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-12-25
            • 2016-02-09
            • 1970-01-01
            • 1970-01-01
            • 2021-11-08
            • 2014-09-22
            • 2015-06-02
            相关资源
            最近更新 更多