Ric*_*cky 1 c unix posix signals ipc
我正在尝试编写一个程序,该程序涉及将信号发送到一个过程,以通知它暂停一段时间,然后在收到另一个信号后重新开始工作。我这样写了一个信号处理程序:
void sig_handler(int alrm)
{
if(sig_rcv==0)
{
printf("Signal received..sig_rcv value: %d\n",sig_rcv);
sig_rcv = (sig_rcv+1)%2;
printf("After increment sig_rcv value: %d\n",sig_rcv);
signal(SIGUSR1,sig_handler);
if(pause()<0)
{
printf("Signal received again..\n");
}
}
else
{
sig_rcv = (sig_rcv+1)%2;
printf("Signal received..sig_rcv value: %d\n",sig_rcv);
signal(SIGUSR1,sig_handler);
}
printf("Exiting..\n");
}
Run Code Online (Sandbox Code Playgroud)
在这里我要维护一个全局变量sig_rcv,它最初为0,如果在零时收到信号,它将进入if条件并暂停另一个信号;另一方面,如果在sig_rcv为1时获得信号,它只会更改该变量的值。我以这种方式编写信号处理程序的目的是将相同的信号用于两个不同的目的。我使用了这个系统调用:
signal(SIGUSR1,sig_handler);
Run Code Online (Sandbox Code Playgroud)
现在,当我将SIGUSR1发送到该进程时,它正在执行直到该pause()语句。但是在第二次发送SIGUSR1之后,它没有显示任何效果,只是冻结在pause语句上。使用另一个信号删除暂停状态后,此问题已解决,例如:
void sig_handler2(int a)
{
sig_rcv = (sig_rcv+1)%2;
printf("Restarting reading...\n");
}
Run Code Online (Sandbox Code Playgroud)
和
signal(SIGUSR2,sig_handler2);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,它工作得很好。所以,我的问题是,为什么会发生这种现象?我们不能在执行为同一信号编写的信号处理程序时等待信号吗?如果是这样,原因是什么?在不使用SIGUSR2的情况下,是否有任何方法可以获得相同的结果?
我们不能在执行为同一信号编写的信号处理程序时等待信号吗?
代码是“永远”等待还是在已经处理后再次接收相同信号,取决于(C / OS)实现。
从POSIX文档中:
在信号的产生与其传递或接受之间的时间内,该信号被称为“待定”。
和
如果产生了随后发生的未决信号,则由实施定义来确定是否已多次交付或接受信号[...]
而且,顺便说一句,从信号处理程序呼叫printf()&朋友是不安全的。