C使用IPC消息队列的信号使用和处理

时间:2017-02-15 10:59:29

标签: c signals

我有一个程序使用信号(SIGUSR2)来设置一个捕获处理程序函数来处理高优先级的传入消息。

程序在主循环中使用msgrcv()从IPC消息队列接收传入消息。当发送到IPC消息队列的消息发送者想要通知程序高优先级消息队列时,它会向进程发送SIGUSR2,让它停止处理可能正在处理的任何当前消息。

在信号捕获处理函数中,我首先进入:

信号(SIGUSR2,SIG_IGN);

忽略任何新的抢先信号。

然后代码处理抢占请求,它将当前正在处理的消息存储回队列,内务处理等,然后在从信号处理函数返回之前:

信号(SIGUSR2,sighandler_func);

问题:如果在接下来的一纳秒内收到另一个闪光处理信号            发出上述信号呼叫,将该过程重新发送给            信号处理函数再次?即:如果主循环中的代码在哪里            它做sighold(SIGUSR2)和sigrelse(SIGUSR2)来停止/启动            收到抢占信号优先或只是            上面的信号调用重新激活信号处理程序?

1 个答案:

答案 0 :(得分:2)

你应该使用sigaction:

struct sigaction act;
memset(&act, 0, sizeof(act);
act.sa_handler = sighandler_func;
sigaction(SIGUSR2, &act, NULL);

这样,信号处理程序会在信号被阻塞时自动调用,从而导致事件发生(在您的情况下为SIGUSR2)。如果现在在执行处理程序期间到达SIGUSR2,它将被阻塞,直到信号处理程序返回。然后,(当信号被解锁时),再次立即调用信号处理程序。

但是,您必须处理这样的情况,即在一次执行信号处理程序期间多个SIGUSR2到达,因为在返回处理程序之后它将只被调用一次