[問題] 有關 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