進程控制開發(fā)之:Linux進程控制編程
3)waitpid()使用實例。
由于wait()函數(shù)的使用較為簡單,在此僅以waitpid()為例進行講解。本例中首先使用fork()創(chuàng)建一個子進程,然后讓其子進程暫停5s(使用了sleep()函數(shù))。接下來對原有的父進程使用waitpid()函數(shù),并使用參數(shù)WNOHANG使該父進程不會阻塞。若有子進程退出,則waitpid()返回子進程號;若沒有子進程退出,則waitpid()返回0,并且父進程每隔一秒循環(huán)判斷一次。該程序的流程圖如圖7.5所示。
圖7.5waitpid示例程序流
該程序源代碼如下所示:
/*waitpid.c*/
#includesys/types.h>
#includesys/wait.h>
#includeunistd.h>
#includestdio.h>
#includestdlib.h>
intmain()
{
pid_tpc,pr;
pc=fork();
if(pc0)
{
printf(Errorforkn);
}
elseif(pc==0)/*子進程*/
{
/*子進程暫停5s*/
sleep(5);
/*子進程正常退出*/
exit(0);
}
else/*父進程*/
{
/*循環(huán)測試子進程是否退出*/
do
{
/*調用waitpid,且父進程不阻塞*/
pr=waitpid(pc,NULL,WNOHANG);
/*若子進程還未退出,則父進程暫停1s*/
if(pr==0)
{
printf(Thechildprocesshasnotexitedn);
sleep(1);
}
}while(pr==0);
/*若發(fā)現(xiàn)子進程退出,打印出相應情況*/
if(pr==pc)
{
printf(Getchildexitcode:%dn,pr);
}
else
{
printf(Someerroroccured.n);
}
}
}
將該程序交叉編譯,下載到目標板后的運行結果如下所示:
$./waitpid
Thechildprocesshasnotexited
Thechildprocesshasnotexited
Thechildprocesshasnotexited
Thechildprocesshasnotexited
Thechildprocesshasnotexited
Getchildexitcode:75
可見,該程序在經(jīng)過5次循環(huán)之后,捕獲到了子進程的退出信號,具體的子進程號在不同的系統(tǒng)上會有所區(qū)別。
讀者還可以嘗試把“pr=waitpid(pc,NULL,WNOHANG);”這句改為“pr=waitpid(pc,NULL,0);”或者“pr=wait(NULL);”,運行的結果為:
$./waitpid
Getchildexitcode:76
可見,在上述兩種情況下,父進程在調用waitpid()或wait()之后就將自己阻塞,直到有子進程退出為止。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評論