[问题] 有关 multi signal loss

楼主: shiningboy   2018-07-12 03:03:05
大家好
想询问有关 signal loss 的问题
就是如果同一时间有多个讯号发送 ,
有捕捉到的讯号就执行 handler 做接下来的工作
但是似乎总会有几个讯号会 loss 掉
例如 :
先设定好 struct sigaction action 及 handler
static void say(int sig){
if(sig == SIGUSR1){
printf("new process created\n");
}
}
sigemptyset(&action.sa_mask);
action.sa_flags = 0;
action.sa_handler = say;
sigaction(SIGUSR1 , &action , NULL);
接着
/*parent process ID*/
pid_t pp = getpid();
pid_t child;
/*fork 三次*/
for(int i=0 ; i<3 ; i++){
switch(child = fork()){
case (-1):{
perror("fork error\n");
exit(1);
break;
}
case 0:{
if( kill(pp , SIGUSR1)){
printf("signal send error\n");
}
break;
}
}
}
/*child processes all terminated*/
if( getpid() != pp ){
_exit(0);
}
while(1){};
也就是说只要有新的 fork process 都会发 SIGUSR1 给 parent process
总共会有七个 child process ,
但是每次执行 , handler 有处理的次数都不一样
查了一下似乎是因为同一时间 , handler 在处理先到的讯号的时候 ,
会忽略后来的讯号 , 但是 handler 处理完之后 , 似乎 SIGUSR1 也没有重发
想请问有什么方法可以确实的接收到每一个发出的讯号 , 以及触发执行 handler 吗?
谢谢
作者: leolarrel (真.粽子无双)   2018-07-12 14:54:00
我的想法是handler处理越短越好,可以学kernel,中断hander只做最少的事情,然后pass给thread或另一个task负责接下来的工作,原来的hander就不会被咬著
作者: Qbsuran (Qbsuran)   2018-07-12 18:44:00
给你关键字 signal block和signalfd()The linux programming interface有提到这问题 如果你的process在排进CPU前同个讯号同时多个抵达 他只能保证至少一个送到

Links booklink

Contact Us: admin [ a t ] ucptt.com