問題描述
參考以上示例程式中建立并發程序的方法,編寫一個父子協作程序,父程序建立一個子程序并控制它每隔 3 秒顯示一次目前目錄中的檔案名清單。
設計思路
由父程序建立子程序,父程序等待子
程序的完成,子程序中執行 ls 指令再次建立了子程序 ps(不必須要建立兩個子程序),之後也是等待子程序的執行,子程序完成 ls 指令後,由于信号量 sleep(3)的設定,間隔 3秒後再次執行該程式,如此循環,直到手動停止。
程式實作
Pctl.c
#include "pctl.h"
int main(int argc, char *argv[])
{
char *args[] = {"/bin/ls","-a",NULL}; //子程序要預設執行的指令
int pid_1,pid_2; //存放子程序号
int status_1,status_2; //存放子程序傳回狀态
while(1){
pid_1=fork() ;
if(pid_1<0) // 建立子程序失敗?
{
printf("Create Process fail!\n");
exit(EXIT_FAILURE);
}
if(pid_1 == 0) // 子程序執行代碼段
{
//報告父子程序程序号
printf("I am Child-ls process %d\nMy father is %d\n",getpid(),getppid());/*getpid 傳回目前程序
的程序号,getppid 傳回目前程序父程序的程序号*/
pid_2=fork();
if(pid_2<0)// 建立子程序失敗?
{
printf("Create Process fail!\n");
exit(EXIT_FAILURE) ;
}
if(pid_2==0) // 子程序執行代碼段
{//報告父子程序程序号
printf("I am Child-ps process %d\nMy father is %d\n",getpid(),getppid());
printf("%d child will Running: \n",getpid()); /*子程序被鍵盤中斷信号喚醒繼續執行*/
status_2=execve("/bin/ps",NULL,NULL);//裝入并執行新的程式
}else{
printf("wait for the ps-child end%d\n",pid_2);
waitpid(pid_2,&status_2,0);//等待子程序 2 結束
//status 用于保留子程序的退出狀态
}
printf("%d child will Running: \n",getpid()); //裝入并執行新的程式 char *argv[]={"0",NULL};
status_1 = execve("/bin/ls",argv,NULL);
}
else{
printf("I am Parent process %d\n",getpid());
printf("wait for the ls-child end %d\n",pid_1);
waitpid(pid_1,&status_1,0);
printf("child end,sleep...\n");
sleep(3);// sleep 函數會令調用程序的執行挂起睡眠 3 秒
}
}
return EXIT_SUCCESS;
}
運作
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TP350MrpXTwsmeNBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLyQDN1MTOwETMxADMxkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)