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