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