Linux日常 訊號(4)子程序的非同步等待方式

2021-08-02 15:32:42 字數 1105 閱讀 1433

1.程序等待的方式:

阻塞,非阻塞,非同步

2.⽤wait和waitpid函式清理僵⼫程序。

⽗程序可以阻塞等待⼦程序結束,也可以⾮阻塞地查詢是否有⼦程序結束等待清理(也就是輪詢的⽅式)。

採⽤第⼀種⽅式,⽗程序阻塞了就不能處理⾃⼰的⼯作了;

採⽤第⼆種⽅式,⽗程序在處理⾃⼰的⼯作的同時還要記得時不時地輪詢⼀ 下,程式實現複雜。

3.⼦程序在終⽌時會給⽗程序發sigchld訊號,該訊號的預設處理動作是忽略,⽗程序可以⾃定義sigchld訊號的處理函式,這樣⽗程序只需專⼼處理⾃⼰的⼯作,不必關⼼⼦程序了,⼦程序終⽌時會通知⽗程序,⽗程序在訊號處理函式中調⽤wait清理⼦程序即可。

//實現單程序退出時向父親傳送17號訊號sigchld

#include

#include

#include

void handler(int sig)

int main()

else

}

執行結果:

父程序等待子程序的非同步版本

#include

#include

#include

void handler(int sig)

else

}while(1);

}int main()

else

}return

0; }

執行結果:

事實上,由於unix 的歷史原因,要想不產⽣僵⼫程序還有另外⼀種辦法:

⽗程序呼叫sigaction將sigchld的處理動作置為sig_ign,這樣fork出來的⼦程序在終⽌時會⾃動清理掉,不 會產⽣僵⼫程序,也不會通知⽗程序。系統預設的忽略動作和⽤戶⽤sigaction函式⾃定義的忽略 通常是沒有區別的,但這是⼀個特例。此⽅法對於linux可⽤,但不保證在其它unix系統上都可用。

Linux下父程序向子程序傳送訊號

需要用到的函式 kill int kill pid,sig int pid,sig 其中,pid是乙個或一組程序的識別符號,引數sig是要傳送的軟中斷訊號。1 pid 0時,核心將訊號傳送給程序pid。2 pid 0時,核心將訊號傳送給與傳送程序同組的所有程序。3 pid 1時,核心將訊號傳送給所有...

Linux中的程序訊號

訊號概念訊號 系統為了響應某些狀況而產生的事件,程序收到訊號需要採取相應的動作。訊號產生訊號產生的條件 1 按下終端鍵 ctrl c ctrl 2 硬體異常 除零操作 無效記憶體 3 某些軟條件發生 時間片到 4 管道破裂 用kill l 可以檢視系統定義的訊號列表 訊號產生的方式 1 通過終端鍵產...

Linux中的程序訊號

1 sighup終止程序 終端線路結束通話 本訊號在使用者終端連線 正常或非正常 結束時發出 通常是在終端的控制程序結束時,通知同一session內的各個作業 這時它們與控制終端不再關聯 2 sigint終止程序 中斷程序 程式終止 interrupt 訊號,在使用者鍵入intr字元 通常是ctrl...