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