作者shiningboy ()
看板LinuxDev
標題[問題] 有關 multi signal loss
時間Thu Jul 12 03:03:05 2018
大家好
想詢問有關 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 嗎?
謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 42.73.195.25
※ 文章網址: https://www.ptt.cc/bbs/LinuxDev/M.1531335787.A.84F.html
※ 編輯: shiningboy (42.73.195.25), 07/12/2018 03:12:10
→ leolarrel: 我的想法是handler處理越短越好,可以學kernel,中斷hand 07/12 14:54
→ leolarrel: er只做最少的事情,然後pass給thread或另一個task負責接 07/12 14:54
→ leolarrel: 下來的工作,原來的hander就不會被咬著 07/12 14:55
推 Qbsuran: 給你關鍵字 signal block和signalfd() 07/12 18:44
推 Qbsuran: The linux programming interface有提到這問題 如果你的 07/12 18:55
→ Qbsuran: process在排進CPU前同個訊號同時多個抵達 他只能保證至 07/12 18:55
→ Qbsuran: 少一個送到 07/12 18:55