C使用IPC消息队列的信号使用和处理
我有一个程序使用信号(SIGUSR2)来设置捕获处理函数来处理高优先级的传入消息。
该程序在其主循环中使用msgrcv()接收来自IPC消息队列的传入消息。 当发送给IPC消息队列的消息想要通知程序高优先级的消息传入时,它会向进程发送SIGUSR2以使其停止处理可能正在处理的任何当前消息。
在信号捕捉处理函数中,我首先进入:
信号(SIGUSR2,SIG_IGN);
忽略任何发生抢先的新信号。
那么代码会处理抢占请求,在该请求中它将当前正在处理的消息存储回队列,内务处理等,然后在从信号处理函数返回之前处理它:
信号(SIGUSR2,sighandler_func);
问题:如果在发出上述信号调用后仅仅几纳秒接收到另一个闪存处理信号,该进程是否会再次重新分派给信号处理函数? 即:如果在主循环中它执行叹息(SIGUSR2)和sigrelse(SIGUSR2)以停止/开始接收抢占信号的代码优先,还是只是上述信号调用重新激活信号处理程序?
你应该为此使用sigaction:
struct sigaction act;
memset(&act, 0, sizeof(act);
act.sa_handler = sighandler_func;
sigaction(SIGUSR2, &act, NULL);
这样,信号处理程序会自动调用阻塞的信号,从而导致事件(在您的情况下SIGUSR2)。 如果SIGUSR2
现在在执行处理程序期间到达,它将被阻塞,直到信号处理程序返回。 然后(当信号被解除阻塞时),信号处理程序再次被立即调用。
但是,您必须处理这种情况,即多次SIGUSR2
在信号处理程序的一次执行过程中正常到达,因为在处理程序返回后它只会被调用一次。