處理多個訊號時產生的問題

2021-06-21 21:15:02 字數 1168 閱讀 2439

#include

#include

#include

#include

#include

void handler( int sig )

int main( int argc, char **argv )

} if( (n=read(stdin_fileno, buf, sizeof(buf))) < 0 )

perror( "read" );

printf( "parent processing input\n" );

while( 1 );

exit( 0 ); }

程式輸出:

hello from child 3556

hello from child 3557

hello from child 3558

handler reaped child 3556

handler reaped child 3557

可見程序3558沒有被**。

原因:父程序建立了3個子程序,並等待其中子程序的終止訊號。

父程序接收捕獲了第乙個sigchld訊號(程序3556的終止訊號)。當處理程式還在處理第乙個訊號時,第二個sigchld訊號(程序3557的終止訊號)就傳送新增到了待處理訊號集了,並等待前乙個sigchld處理程式的結束(也就是被前乙個阻塞)。很快,當處理程式還在處理第乙個訊號時,第三個訊號(程序3558終止訊號)來了,由於任意型別至多只有乙個待處理訊號,所以訊號3被丟棄。當第乙個訊號的處理程式返回後,核心執行第二個訊號的處理程式。這樣,第三個訊號久丟失了。

修正方法:

改變訊號處理程式:

void handler( int sig )

輸出:

hello from child 3551

hello from child 3552

hello from child 3553

handler reaped child 3551

handler reaped child 3552

handler reaped child 3553

改動原理:

存在乙個待處理訊號只是暗示自程序最後一次收到乙個訊號以來,至少已經有乙個這種型別的訊號被傳送了。所以應該在每次訊號處理函式被呼叫時,**盡可能多的僵死程序。這樣就不會發生上述情況。

Linux 多執行緒應用 訊號產生,訊號處理

筆者有一種應用場景,a 執行緒從 socket 接收指令,根據指令在 b 執行緒進行相應工作。採用訊號機制,設定 sigusr1 的訊號處理函式 sighandler,a 執行緒解析指令後發射訊號 sigusr1,b 執行緒執行sighandler.因對 posix 訊號機制不熟,過程中產生了一些誤...

訊號處理技術 關於EMD的產生

通俗易懂,有助於理解emd和hht,就原封不動的搬過來了。關於emd的產生 自傅利葉變換與頻譜分析技術產生,人們得以從另外乙個角度觀察時域訊號,訊號裡各個點的密集程度,得以確定性地度量。之後,又產生了加窗傅利葉 小波變換 維格納分布等時頻分析技術。98年,黃大大又提出了一種新的時頻分析技術,即hht...

多個viewpager可能產生的問題

由於fragment的方便性,現在很多人開始大量使用fragment。今天使用時遇到各問題,記錄下來並分享下。使用fragment都會用fragmentactivity 特別是在用到viewpager時。因為需要framgmentmanager,而我這次有兩個fragment中都用到了viewpag...