如何使用SIGUSR1替代值

时间:2013-05-21 09:58:11

标签: c linux signals

man 7 signal中,它将SIGUSR1显示为SIGUSR1 30,10,16 Term User-defined signal 1。如果我在我的C代码中使用SIGUSR1,我得到值10.有没有办法访问其他值30& 16?是否可以在我的信号处理程序中明确使用它们,如

if(signo == 16)
{
   printf("SIGUSR1 type 2 received\n");
}

编辑:在我的代码中,有一个使用SIGUSR1的case语句。我还需要一个自定义信号。我知道有RTSIGNALS和其他选项。但我想知道为什么他们在man page中指定16,30并且从未提供使用它的方法。

3 个答案:

答案 0 :(得分:5)

手册说

  

几个信号编号取决于架构,如“值”列中所示。 (给出三个值,第一个通常对alpha和sparc有效,中间一个用于i386,ppc和sh,最后一个用于mips.A - 表示相应架构上没有信号。)< / p>

SIGUSR1在你正在运行的任何机器上只有一个值...没有替代值;只需使用定义的常量SIGUSR1。使用16将给出错误的信号......在表格中进一步查看,您将看到SIGSTKFLT。

  

我还需要一个自定义信号

SIGUSR2有什么问题?

答案 1 :(得分:2)

SIGUSR1值取决于平台.SIGUSR1可以是30,10或16.例如,基于x86的Linux将SIGUSR1定义为10.实际上,使用30作为SIGUSR1的Linux的唯一风格是DEC Alpha和SPARC。

答案 2 :(得分:-1)

信号只是从一个进程发送到另一个进程的数字。只有在SIGKILL等罕见情况下,系统才会特别干扰和处理它们;默认是将信号编号发送到另一个进程并让它处理。为了将其包装起来并使其可移植,有些约定用于哪种情况(以及支持这些约定的#define列表)。其中一些约定在man 7 signal引用的POSIX标准中得到了推广。

您可以完全自由地使用信号(例如,在不使用任何#define的情况下使用数字)。请注意,通过这种方式,您可能会失去可移植性和可理解性。 (维护代码的下一个开发人员可能希望为此杀死你。)