【问题标题】:What is correct way to have single Signal Handler function for multiple Signals?为多个信号提供单个信号处理程序功能的正确方法是什么?
【发布时间】:2010-10-24 16:20:19
【问题描述】:

在 Linux 上使用 C 语言设置一个可以处理具有相同功能的多个 POSIX 信号的程序的最佳方法是什么?

例如,在我的代码中,我有一个处理函数,当捕获到信号以执行某些操作时,我想一般调用它:

/* Exit handler function called by sigaction */
void exitHandler( int sig, siginfo_t *siginfo, void *ignore )
{
  printf("*** Got %d signal from %d\n", siginfo->si_signo, siginfo->si_pid);
  loopCounter=0;

  return;
}

我设置了两个信号,通过对每个信号进行单独的 sigaction 调用来捕获:

/* Set exit handler function for SIGUSR1 , SIGINT (ctrl+c) */
struct sigaction act;
act.sa_flags = SA_SIGINFO;
act.sa_sigaction = exitHandler;
sigaction( SIGUSR1, &act, 0 );
sigaction( SIGINT, &act, 0 );

这是设置此类处理的正确方法吗?有没有其他方法可以让我不必枚举所有可能的信号编号?

【问题讨论】:

    标签: c posix signals


    【解决方案1】:

    我看不出如何直接为 all 信号设置单个处理程序。但是,您可以使用sigfillset() 生成一个包含所有有效信号编号的集合,然后使用sigismember() 迭代可能的信号编号以确定该数字是否在集合中,从而相当关闭,如果是,则设置一个处理程序。好的,我看不到确定最大可能信号数的方法,因此您可能需要猜测一个合适的最大值。

    【讨论】:

    • 谢谢,这是个好主意。我想我可以继续列举我想捕捉的信号,因为我是 C 的新手,我很好奇我是否遗漏了什么。
    【解决方案2】:

    “sigaction”系统调用的“signum”参数是一个整数值,不能作为标志。

    据我所知,没有办法在一次调用中为多个信号分配一个处理函数。

    【讨论】:

      【解决方案3】:

      这是设置此类处理的正确方法吗?

      不完全是 - it's not safe to use printf() inside a signal handler,但您仍然可以使用 write()stdoutstderr

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-15
        • 1970-01-01
        相关资源
        最近更新 更多