深度辨析wait函式和訊號機機制

2021-09-26 03:45:03 字數 1623 閱讀 6057

我們都知道父程序通過wati系統呼叫等待子程序結束,處理僵死的子程序,但是其其內部機制到底如何?這篇部落格將帶你深度探索wait機制,並順便解釋了有關linux訊號的相關問題。

首先明確wait的作用:遍歷所有子程序,處理乙個處於僵死狀態的子程序,如果沒有僵死子程序,阻塞等待。如果根本就沒有子程序,立刻返回-1,並設定相應的errno。綜上不難看出,有wait的呼叫次數應該至少是子程序數,不然有僵死子程序得不到處理。wait呼叫次數超過子程序數沒有大問題,因為立即返回-1。

其次,我們來看一下子程序退出是幹了些什麼。首先檢查自己的父程序是否將sigchld對應的處理函式設定為了sig_ign(使用signal(sigchld,sig_ign);進行設定)。如果設定,子程序直到父程序根本不關心自己,直接自我了斷(也不會進行什麼init託管)。這裡需要強調的幾點:

如果父程序沒有sig_ign,先傳送訊號sigchld(將sigchld訊號放到父程序的pending佇列中),之後檢查父程序是否阻塞在wait上,如果是,則將父程序喚醒(設定為running)。

核心**如下:

//子程序向父程序傳送訊號

if(valid_signal(sig) && sig)

_group_send_sig_info(sig,&info,tsk->parent);

//子程序嘗試喚醒父程序,如果父程序正在等待其終止

__wake_up_parent(tsk,tsk->parent);

最後,來看一下父程序。父程序分兩種情況:

接下來通過乙個小實驗來證明一下上述流程。

我們現在父程序中設定乙個sigchld的處理函式,裡面進行wait,之後fork子程序,父程序在自己的主邏輯中使用wait等待。**如下:

這裡有乙個令人迷惑的地方就是wait success在訊號處理函式之後,我猜想的原因是在wait函式處理完僵死子程序後,但是還沒有返回,核心進行了一次排程,執行訊號函式。。。是不是有點眼熟?前面說過核心會在阻塞函式返回時進行排程。但是也可能是處理完僵死子程序後,返回前遇到乙個時鐘中斷,具體原因不得而知。

為了進一步說明正確性,再將實驗公升級,**如下,主要涉及兩個子程序,第二個子程序不返回:

接下來在另乙個終端kill掉子程序,效果如下:

辨析虛擬機器和ubuntu

相信剛開始接觸虛擬機器的同志都會分不清虛擬機器和ubuntu是什麼,和他們之間的關係,以及他們的作用。首先我們先說說虛擬機器是什麼。虛擬機器就是一款可以為其他系統來提供相應環境的軟體。比如你不想裝雙系統,因為這是有風險的,有可能會把你原系統裡的一些重要資料清除還有可能是你的電腦配置不允許 簡單來說就...

深度剖析C 全域性建構函式和析構函式的呼叫機制

c 全域性建構函式和析構函式的呼叫機制 控制台exe中c 的全域性變數在main之前初始化,在main之後清除,vc編譯器 鏈結器和vc執行庫 互相配合完成了這個魔術。請複製這段 到你新建的控制台程式,建立並執行 include stdafx.h include define secname crt...

微控制器函式 crol 和 cror

crol 函式功能 將 c 進行b位左位移,並將值以unsigned char型別返回 文件定義 unsigned char crol unsigned char c,character to rotate left unsigned char b bit positions to rotate 函...