所有POSIX / SUS信号都是#define是给定还是假设?

时间:2014-01-31 16:41:47

标签: c signals posix sus

信号在实施方面有所不同。 APUE(Unix环境中的高级编程)中有一些不错的表,例如第2版第292页的“图10.1 UNIX系统信号”。

因此,让我们采用示范SIGWAITING。信号显示为in the documentation as int,但大多数实现似乎使用#define而不是const int

但是,标准是否规定任何人可以依赖#define d的信号?或者我可以基于这样的事实来假设它,例如,几乎每个现有实现都使用#define。或者这是一个不好的假设?

基本原理是:如果我可以依赖#define使用,我可以使用#ifdef隐藏来自不使用它的实现的更奇特的信号。对于const int常量名称,我不知道有一个类似的机制可以让这个编译时间做出决定。

1 个答案:

答案 0 :(得分:3)

请参阅<signal.h>的POSIX(2008,2013)规范。在某种程度上,它说:

  

<signal.h>标头应定义以下宏,用于指代系统中发生的信号。此处定义的信号以字母SIG开头,后跟大写字母。宏应扩展为具有int和distinct值类型的正整数常量表达式。值0保留用作空信号(参见kill())。系统中可能会出现其他实现定义的信号。

     

...

     

所有实施都应支持以下信号......

然后是一个信号名称表。您链接的版本是标准的2004版本,并且信号名称不是宏,但后面的版本编码现有的做法。

因此,要符合POSIX,信号名称应为#define'd。