進程控制開發(fā)之:實驗內(nèi)容
7.4實驗內(nèi)容
7.4.1編寫多進程程序
1.實驗目的
通過編寫多進程程序,使讀者熟練掌握fork()、exec()、wait()和waitpid()等函數(shù)的使用,進一步理解在Linux中多進程編程的步驟。
2.實驗內(nèi)容
該實驗有3個進程,其中一個為父進程,其余兩個是該父進程創(chuàng)建的子進程,其中一個子進程運行“ls-l”指令,另一個子進程在暫停5s之后異常退出,父進程先用阻塞方式等待第一個子進程的結束,然后用非阻塞方式等待另一個子進程的退出,待收集到第二個子進程結束的信息,父進程就返回。
3.實驗步驟
(1)畫出該實驗流程圖。
該實驗流程圖如圖7.8所示。
圖7.8實驗7.4.1流程圖
(2)實驗源代碼。
先看一下下面的代碼,這個程序能得到我們所希望的結果嗎,它的運行會產(chǎn)生幾個進程?請讀者回憶一下fork()調(diào)用的具體過程。
/*multi_proc_wrong.c*/
#includestdio.h>
#includestdlib.h>
#includesys/types.h>
#includeunistd.h>
#includesys/wait.h>
intmain(void)
{
pid_tchild1,child2,child;
/*創(chuàng)建兩個子進程*/
child1=fork();
child2=fork();
/*子進程1的出錯處理*/
if(child1==-1)
{
printf(Child1forkerrorn);
exit(1);
}
elseif(child1==0)/*在子進程1中調(diào)用execlp()函數(shù)*/
{
printf(Inchild1:execute'ls-l'n);
if(execlp(ls,ls,-l,NULL)0)
{
printf(Child1execlperrorn);
}
}
if(child2==-1)/*子進程2的出錯處理*/
{
printf(Child2forkerrorn);
exit(1);
}
elseif(child2==0)/*在子進程2中使其暫停5s*/
{
printf(Inchild2:sleepfor5secondsandthenexitn);
sleep(5);
exit(0);
}
else/*在父進程中等待兩個子進程的退出*/
{
printf(Infatherprocess:n);
child=waitpid(child1,NULL,0);/*阻塞式等待*/
if(child==child1)
{
printf(Getchild1exitcoden);
}
else
{
printf(Erroroccured!n);
}
do
{
child=waitpid(child2,NULL,WNOHANG);/*非阻塞式等待*/
if(child==0)
{
printf(Thechild2processhasnotexited!n);
sleep(1);
}
}while(child==0);
if(child==child2)
{
printf(Getchild2exitcoden);
}
else
{
printf(Erroroccured!n);
}
}
exit(0);
}
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評論