Linux SIGCHLD訊號處理

2021-08-15 21:02:01 字數 3569 閱讀 8270

sigchld的產生條件

1、子程序終止時

2、子程序接收到sigstop訊號停止時

3、子程序處在停止態,接受到sigcont後喚醒時

源**signal_test.c

#include 

#include

#include

#include

​void

handle_sig_child()

intmain(int

argc, char**

argv)

else

if(pid!=-

1)else

}

執行結果:

where@ubuntu:~$ ./sigal_child_test 

child pid [9881]

child pid [9881] return [0]

其他的實驗測試,你可以使用kill命令給子程序傳送sigstop、sigcont以及sigint等資訊,觀察現象。

​單個子程序的時候可以這麼處理,但是如果有多個子程序,如果多個子程序在極短的時間類同時退出產生sigchld資訊,那麼由於未決訊號集不支援排隊,有可能有些訊號就不執行了。看下面的例子:

#include 

#include

#include

#include

#include

#include

​void

handle_sig_child()

intmain(int

argc, char**

argv)

if(++

count

<

10)

goto

again;

while(1)

sleep(1);

}

執行結果:

$ ./a.out 

child pid [7785]

child pid [7784]

child pid [7783]

child pid [7782]

child pid [7781]

child pid [7787]

child pid [7788]

child pid [7780]

child pid [7779]

child pid [7786]

recv child pid 7779

child process exited with 0

recv child pid 7780

child process exited with 0

recv child pid 7781

child process exited with 0

上面的結果產生十個子程序,退出後產生十個sigchld,但是只執行了3次訊號處理函式。

$ ps

-efwhere     7778

3197

018:34 pts/2    00:00:00 ./a.out

where     7782

7778

018:34 pts/2    00:00:00 [a.out]

where     7783

7778

018:34 pts/2    00:00:00 [a.out]

where     7784

7778

018:34 pts/2    00:00:00 [a.out]

where     7785

7778

018:34 pts/2    00:00:00 [a.out]

where     7786

7778

018:34 pts/2    00:00:00 [a.out]

where     7787

7778

018:34 pts/2    00:00:00 [a.out]

where     7788

7778

018:34 pts/2    00:00:00 [a.out]

where     7790

4193

018:34 pts/18   00:00:00 ps

-ef

出現未**的情況,我們需要改進一下**函式。

#include 

#include

#include

#include

#include

#include

​void

handle_sig_child()

while(pid!=-

1);}

intmain(int

argc, char**

argv)

if(++

count

<

10)goto

again;

while(1)

sleep(1);

}

執行結果:

$ ./a.out 

child pid [7851]

child pid [7852]

child pid [7847]

child pid [7850]

child pid [7849]

child pid [7853]

child pid [7854]

child pid [7855]

child pid [7856]

child pid [7848]

recv child pid 7847

child process exited with 0

recv child pid 7848

child process exited with 0

recv child pid 7849

child process exited with 0

recv child pid 7850

child process exited with 0

recv child pid 7851

child process exited with 0

recv child pid 7852

child process exited with 0

recv child pid 7853

child process exited with 0

recv child pid 7854

child process exited with 0

recv child pid 7855

child process exited with 0

recv child pid 7856

child process exited with 0

recv child pid -1

child process exited with 0

recv child pid -1

child process exited with 0

十個子程序都完美**。

python數字訊號處理pdf 數字訊號處理

課程內容 第一章 簡介 介紹數字訊號處理的基本概念,優勢以及應用場景 介紹本課程基本框架 介紹本課程成績評估方法 序列及其基本運算 卷積 相關運算 序列的向量表示與訊號空間 epfl資料 離散時間系統及其性質 lti離散時間系統及其穩定性和因果性條件 第三章 離散時間傅利葉變換 lti離散時間系統的...

mysql 記錄號 MySQL 簡單記錄訊號處理

碼版本 5.7.29 簡單記錄訊號如何生效的。poll收到訊號後如何中斷後如何處理的,需要確認。一初始化訊號處理方式,設定訊號的處理的處理方式,遮蔽某些訊號,並且繼承到子執行緒 pthread sigmask 主要遮蔽的為sigterm sigquit sighup sigtstp四個。其他訊號按照...

從Linux 0 11核心看Linux訊號處理機制

摘要 訊號處理機制是unix作業系統的一大特點。本文以linux0.11訊號處理相關原始碼為例,針對幾個細節對訊號處理的整個流程進行描述,力求簡單明瞭,參考趙炯博士的 linux核心完全剖析 和潘曉雷的 linux0.11原始碼分析 所謂訊號,是一種軟中斷機制,是實現程序間非同步通訊的手段。訊號的傳...