[問題] 有關 multi signal loss

看板LinuxDev作者時間6年前 (2018/07/12 03:03), 6年前編輯推噓2(205)
留言7則, 2人參與, 6年前最新討論串1/1
大家好 想詢問有關 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

07/12 14:54, 6年前 , 1F
我的想法是handler處理越短越好,可以學kernel,中斷hand
07/12 14:54, 1F

07/12 14:54, 6年前 , 2F
er只做最少的事情,然後pass給thread或另一個task負責接
07/12 14:54, 2F

07/12 14:55, 6年前 , 3F
下來的工作,原來的hander就不會被咬著
07/12 14:55, 3F

07/12 18:44, 6年前 , 4F
給你關鍵字 signal block和signalfd()
07/12 18:44, 4F

07/12 18:55, 6年前 , 5F
The linux programming interface有提到這問題 如果你的
07/12 18:55, 5F

07/12 18:55, 6年前 , 6F
process在排進CPU前同個訊號同時多個抵達 他只能保證至
07/12 18:55, 6F

07/12 18:55, 6年前 , 7F
少一個送到
07/12 18:55, 7F
文章代碼(AID): #1RHbHhXF (LinuxDev)
文章代碼(AID): #1RHbHhXF (LinuxDev)