首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sigaction系统调用

sigaction系统调用
EN

Stack Overflow用户
提问于 2012-01-27 19:42:58
回答 4查看 344关注 0票数 1

我看了sigaction的手册页,最后看了下面这一行。

代码语言:javascript
复制
sigaction(): _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCE

_POSIX_X_SOURCE,_X_OPEN_SOURCE,_POSIX_SOURCE是什么意思?怎么处理它呢?

EN

回答 4

Stack Overflow用户

发布于 2012-01-27 22:05:37

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

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

一个正确的程序应该总是显式地使用正确的特性测试宏来满足它所编写的标准。要做到这一点,最简单的方法是在编译器命令行(CFLAGS)上放置正确的-D参数。将#define添加为每个源文件的第一行也是有效的。但是,如果您在源文件中执行此操作,请注意:

在对任何系统头进行included.

  • It's之前,必须在顶层定义
  1. 功能测试宏。在不同的翻译单元中使用不同的功能测试宏通常不是一个好主意。

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

票数 3
EN

Stack Overflow用户

发布于 2012-01-27 19:44:27

这里有一个处理功能宏的方法: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
EN

Stack Overflow用户

发布于 2012-01-27 19:44:34

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

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

代码语言:javascript
复制
#define _XOPEN_SOURCE
#include <signal.h>

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9032782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档