看板 LinuxDev 關於我們 聯絡資訊
大家好 想詢問有關 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