2012-01-27 108 views
1

我正在看sigaction的man页面,最后我看了下面一行。sigaction系统调用

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

_POSIX_X_SOURCE,_X_OPEN_SOURCE,_POSIX_SOURCE是什么意思?该怎么办?

回答

1

下面是功能宏的人: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

1

他们是你得到原型的#define的东西,并且被称为feature test macros

例如,下面的代码将susscessfully定义原型sigaction

#define _XOPEN_SOURCE 
#include <signal.h> 

包含signal.h而不#define(或其他人)不会限定的原型。

1

它是一个Feature test macro.

符号称为“功能测试宏”被用来控制可能被包括在报头符号的可见性。 IEEE Std 1003.1-2001的实现,未来版本和其他标准可定义附加的功能测试宏。

2

这些是功能测试宏。他们的目的是允许你的程序通知系统头文件你希望它符合哪个标准,以及你想要什么扩展。

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

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

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

顺便说一句,这是不完全一样的其他功能测试宏,但是当建立在Linux/glibc的要求将off_t是64位大文件支持所有现代的程序应该定义_FILE_OFFSET_BITS=64