我正在将程序的信号处理从 signal() 转换为 sigaction()。
根据UNIX 规范, astruct sigaction
至少应该有 4 个成员;sa_handler
, sa_mask
,sa_flags
和sa_sigaction
.
当我如下定义一个结构时,一切似乎都很正常。
...
#include <signal.h>
...
struct sigaction sa;
但是当我尝试为 赋值时sa_handler
,该成员不存在。相反,我看到了这个:
我查看了我的signal.h
and bits/sigaction.h
(如果你想知道的话,两者都没有 1092 行),似乎没有任何问题。
我也尝试按原样使用此成员名称,但编译器抱怨
从类型'void(*)(int)'分配给类型'union'时无法比较的类型
这让我觉得我的编译器/IDE 处理结构定义的方式有问题,但这超出了我的诊断范围。
任何帮助或建议将不胜感激。
系统信息:
- Debian 8
- linux 3.16.0-4-amd64
- gcc 4.9.2 (Debian 4.9.2-10)
- 日食-cdt 3.8.1
更新 - 2016 年 8 月 3 日
在此处和此处找到这两个线程,建议分别定义预处理器符号_POSIX_C_SOURCE
和_XOPEN_SOURCE
。我定义了每一个(一次一个)并且都“修复”了不兼容的类型问题(我成功地为 sa.__sigaction_handler 分配了一个值)。但是它们都破坏了我的软件使用类型 intptr_t(用于线程函数管理)的能力,并因此被删除。
但是,这样做可以解决问题。我现在可以为 sa.sa_handler 分配一个变量,而编译器不会抛出错误。IDE 仍将其显示为不存在的成员(与上面链接的图像相同),但恕我直言,这是一个小问题。