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