我有一個簡單的程序在Linux下發送SIGUSR1信號給它的子進程的一個循環。但是當我發送例如有時會發生10個信號,表明孩子只收到3個信號。最後發送的信號總是SIGUSR2,並且每次都收到。信號在C排隊
信號排隊,或者當進程沒有處理前一個時,它被簡單地覆蓋?有什麼方法可以發送隊列中的信號?
我有一個簡單的程序在Linux下發送SIGUSR1信號給它的子進程的一個循環。但是當我發送例如有時會發生10個信號,表明孩子只收到3個信號。最後發送的信號總是SIGUSR2,並且每次都收到。信號在C排隊
信號排隊,或者當進程沒有處理前一個時,它被簡單地覆蓋?有什麼方法可以發送隊列中的信號?
什麼情況如下:收到
一旦信號處理程序完成信號nr1,它將處理信號nr2,然後信號處理程序將處理SIGUSR2。
基本上,相同類型的未決信號不會排隊,而是被丟棄。不,沒有簡單的方法可以通過這種方式「發送」發送信號。人們總是會假設可能會丟棄幾個信號,並試圖讓處理程序執行清理工作並找出要做的事情(例如,如果所有兒童都在同一時間死亡,則收穫兒童)。
您的問題可能是SIGUSR2是一個立即傳送的信號,而其他信號被阻塞或排隊(處於狀態未決狀態)。
這裏是你如何檢查掛起信號:http://www.gnu.org/s/libc/manual/html_node/Checking-for-Pending-Signals.html
如果多個相同類型的信號被髮送並且未被處理,它們不會被排隊。說程序掩碼SIGUSR1
,調用kill(getpid(), SIGUSR1)
10次,並揭露SIGUSR1
。它只會收到SIGUSR1
一次。
因此,只有在結構信號sa_flags
字段使用標誌SA_NODEFER
並且從不阻止信號的情況下,SIGIO似乎可以同時對多個文件執行I/O操作。
那麼,可以從信號處理程序中獲取中斷,併爲每個正在處理的單個信號創建新的線程。這變得複雜:)所以難怪爲什麼沒有人似乎使用SIGIO。
非常感謝,那就是問題所在。所以我的解決方案是,在每次接收到SIGUSR1子進程後,我回答SIGUSR2,並且父進程在從子進程接收到SIGUSR2確認之前不會發送另一個SIGUSR1。它似乎工作!再次感謝:) – 2011-03-12 22:52:46