2

其中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 和其他选项。但我想知道为什么他们在手册页中指定 16,30 并且从不提供使用它的方法。

4

3 回答 3

6

手册说

几个信号编号取决于架构,如“值”列中所示。(其中给出了三个值,第一个通常对 alpha 和 sparc 有效,中间一个对 i386、ppc 和 sh 有效,最后一个对 mips 有效。A - 表示相应架构上不存在信号。)

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

我还需要一个自定义信号

SIGUSR2 有什么问题?

于 2013-05-21T10:03:38.870 回答
2

SIGUSR1 的值取决于平台。SIGUSR1 可以是 30、10 或 16。例如,基于 x86 的 Linux 将 SIGUSR1 定义为 10。事实上,使用 30 表示 SIGUSR1 的唯一 Linux 版本是 DEC Alpha 和 SPARC。

于 2013-05-21T10:06:59.633 回答
-1

信号只是从一个进程发送到另一个进程的数字。仅在极少数情况下,如SIGKILL系统干预和特殊处理;默认是将信号编号发送给其他进程并让它处理。为了将其包装起来并使其可移植,有一些约定,哪个数字用于哪种情况(以及#define支持这些约定的 s 列表)。其中一些约定在man 7 signal所指的 POSIX 标准中得到了概括。

您完全可以随意使用信号(例如,使用数字而不使用任何#defines)。请注意,这样您可能会失去可移植性和可理解性。(下一个维护您的代码的开发人员可能想为此杀死您。)

于 2013-05-21T10:06:00.890 回答