Linux——wait()、waitpid()函數(shù)及其基礎(chǔ)實(shí)驗(yàn)

wait()和waitpid()

函數(shù)說(shuō)明

? wait()函數(shù)用于使父進(jìn)程(也就是調(diào)用wait()的進(jìn)程)阻塞,直到一個(gè)子進(jìn)程結(jié)束或者該進(jìn)程接收到了一個(gè)指定的信號(hào)為止。如果該父進(jìn)程沒(méi)有子進(jìn)程或者它的子進(jìn)程已經(jīng)結(jié)束,則wait()函數(shù)就會(huì)立即返回。

? waitpid()的作用和wait()一樣,但它并不一定要等待第一個(gè)終止的子進(jìn)程(它可以指定需要等待終止的子進(jìn)程),它還有若干選項(xiàng),如可提供一個(gè)非阻塞版本的 wait()功能,也能支持作業(yè)控制。實(shí)際上,wait()函數(shù)只是 waitpid()函數(shù)的一個(gè)特例,在Linux 內(nèi)部實(shí)現(xiàn) wait()函數(shù)時(shí)直接調(diào)用的就是waitpid()函數(shù)。

函數(shù)格式

? 下圖為wait()函數(shù)的格式


? ? 下圖為waitpid()函數(shù)的格式


基礎(chǔ)實(shí)驗(yàn)

實(shí)驗(yàn)1

? ? 本實(shí)驗(yàn)中首先使用fork()創(chuàng)建一個(gè)子進(jìn)程,然后讓其子進(jìn)程暫停5s(使用了sleep()函數(shù))。接下來(lái)對(duì)原有的父進(jìn)程使用waitpid()函數(shù),并使用參數(shù)WNOHANG是該父進(jìn)程不會(huì)阻塞。若有子進(jìn)程退出,則waitpid()返回子進(jìn)程號(hào);若沒(méi)有子進(jìn)程退出,則waitpid()返回0,并且父進(jìn)程每隔1s循環(huán)判斷一次。該程序的流程圖如下:


? 程序源代碼我上傳到網(wǎng)站,可以免費(fèi)下載waitpid.c文件


? 下載文件后,使用命令:gcc waitpid.c -o waitpid

? ? 然后執(zhí)行命令:./waitpid? 結(jié)果如下圖;


? 從輸出結(jié)果就可以看出程序的執(zhí)行流程。先執(zhí)行一次父進(jìn)程,父進(jìn)程睡眠1s,此時(shí)執(zhí)行子進(jìn)程,然后子進(jìn)程睡眠5秒;接著再執(zhí)行父進(jìn)程監(jiān)聽(tīng)。

實(shí)驗(yàn)2

? 本實(shí)驗(yàn)使用函數(shù)wait(),同實(shí)驗(yàn)2一樣,也是先用fork()新建一個(gè)子進(jìn)程,然后讓子進(jìn)程暫停5s。接下來(lái)對(duì)原有的父進(jìn)程使用wait()函數(shù)。不同的是,wait()函數(shù)會(huì)使得父進(jìn)程阻塞,通過(guò)本實(shí)驗(yàn)的結(jié)果就可以看出。代碼如下:


? 執(zhí)行結(jié)果如下圖


原文鏈接:https://blog.csdn.net/mybelief321/article/details/9066359

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容