c - sigaction 系统调用

标签 c linux macros posix signals

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

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

_POSIX_X_SOURCE、_X_OPEN_SOURCE、_POSIX_SOURCE 是什么意思?用它做什么?

最佳答案

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

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

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

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

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

关于c - sigaction 系统调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9032782/

相关文章:

c - malloc 双重释放行为

c# - 在哪里可以找到 Windows 控制台 API 函数的 Linux 对应项?

c - 是否有称为 micro 的预处理器指令?

python - C Python 模块——导入错误 : Symbol not found: _Py_InitModule4_64

c - 跨多个文件的变量访问

c - 段错误 - 无法访问内存,Kern_Invalid_Address

Linux文件系统骨架版本控制

c++ - 您通常在哪里安装从源代码构建的库的调试版本?

使用 __VA_ARGS__ 连接字符串

macros - 如何在仅使用 rustc 进行代码分析的现有项目中获得与 Cargo 类似的依赖项解析?