淺試Linux 下的 waitpid

2021-10-10 08:28:03 字數 1607 閱讀 8613

pid_t waitpid(pid_t pid,int * status,int options);

**幫助:**

**功能:**waitpid()會暫時停止目前程序的執行,直到有訊號來到或子程序結束。如果在呼叫 waitpid()時子程序已經結束,則 waitpid()會立即返回子程序結束狀態值。

引數設定:pid=0,表示等待識別碼與目前程序相同的任何子程序;

​ status=null, 表示忽略程序的結束狀態;

​ options=0,表示不提供了一些額外的選項來控制waitpid。

呼叫格式如:waitpid(0,null,0)

執行結果:

**回答問題:**當父程序不等待子程序的結束時,執行結果如何?請分析原因。

不等待執行的結果:

分析:父程序不等待子程序結束,即注釋**ret = waitpid(0,null,0);

waitpid()函式的作用是暫時停止目前程序的執行,直到有訊號來到或子程序結束。

如果在呼叫 waitpid()時子程序已經結束,則 waitpid()會立即返回子程序結束狀態值。

當父程序等待子程序的結束時:

​ 通過while 語句持續申請建立子執行緒,fork()一次呼叫,兩次返回,返回的次序是無序的,有可能先進入子程序,也有可能返回大於0的數,進入父程序。不注釋waitpid()語句,父程序等待子程序的結果,程式先進入第乙個判斷體,執行 p1 == 0 的**塊,程式進入子執行緒,輸出列印子程序的pid 和 其父程序的pid ,exit(0) , 從子程序退出。子程序退出,等待結束,意味著會通過else判斷語句 ,即(pid > 0 )的判斷進入else **塊,執行waitpid()下邊的語句。輸出父程序的pid,和父程序的父程序的pid。通過waitpid()函式,保證了父子程序按照」子程序 -> 父程序」的順序執行

當父程序不等待子程序的結束時:

​ 在上一部分等待子程序結束的回答的背景下,不等待子程序結束,程式在(pid > 0 )的**塊中順序執行,輸出父程序的pid,父程序的父程序的pid,退出父程序。結束之後,(pid==0 ) 的判斷語句通過,程式進入到fork()申請的子程序中,這時輸出child id是此程序的pid , 因為他的父程序已經於他之前結束了,這個程序就變成了乙個沒有爸爸的孤兒,這個孤兒程序會被init程序這個孤兒院長(程序號為1)所收養,由init程序對它們完成狀態收集工作。

試水linux並折騰一下VNC

systemd 問題的處理 系統 debian buster with kde vncserver tigervnc 最近折騰的小總結 查詢相關文件。檢視相關日誌。配置xstartup。配置systemd。參照官方的doc。禁用預設的啟動項,呼叫對應桌面的啟動命令,以及對應啟動命令,或者直接呼叫xi...

Linux中的目錄結構淺讀

linux的目錄結構為樹狀目錄結構,如下圖所示,但是下圖只顯示了第一層的部分,其中 表示的linux的根目錄,第二層有 bin boot dev etc home lib lost found media mnt opt proc root sbin tmp usr var等。home 使用者的主目...

Python下的深拷貝 淺拷貝和賦值

最近刷題時遇到關於拷貝的題。特別是在遞迴這種型別的問題是很容易踩坑。所以把這個總結下來。修改不可變物件 str tuple等 需要開闢新的空間 修改可變物件 list等 不需要開闢新的空間 import copy a 1,2,3,a b c b a 賦值 c copy.copy a 淺拷貝 d co...