實驗要求:編寫一個多進程併發執行程序。父進程首先建立一個執行 ls 命令的子進程然//後再建立一個執行ps 命令的子進程,並控制ps 命令總在 ls 命令以前執行。
//Copyright:(C) 2013.4 By ZhengDujin
//Linux Ubuntu12.04 Gcc Vim
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
typedef void (*sighandler_t)(int);
void sigcat(){
printf("Coming back to the process %d.\n",getpid());
}
int main(){
int status;//存放子進程返回狀態
pid_t pls,pps;//存放子進程號
signal(SIGINT,(sighandler_t)sigcat);//註冊一個本進程處理鍵盤中斷的函數
char *args1[]={"/bin/ls","-a",NULL};
char *args2[]={"/bin/ps","-l",NULL};
pls=fork();//建立子進程運行命令 /bin/ls
//printf("Process %d is created which for /bin/ls.\n",getpid());
if(pls<0){
printf("Error ocurrs while creating new process.\n");
exit(EXIT_FAILURE);
}
else if(pls==0){//子進程代碼段
printf("Process %d is waiting for /bin/ps running.\n",getpid());
pause();//暫停,接收SIGINT信號後繼續執行
printf("/bin/ls is going to be run in process %d.\n",getpid());
status=execve(args1[0],args1,NULL);//裝入並執行新程序
printf("Error ocurrs while running /bin/ls.\n");
exit(EXIT_FAILURE);
}
else{
pps=fork();//建立子進程運行命令 /bin/ps
// printf("Process %d is created which for /bin/ps.\n",getpid());
if(pps<0){
printf("Error ocurrs while creating new process:Abort\n");
exit(EXIT_FAILURE);
}
else if(pps==0){
printf("Process %d is going to run /bin/ps.\n",getpid());
status=execve(args2[0],args2,NULL);//裝入並執行新程序
printf("Error ocurrs while running /bin/ps.\n");
exit(EXIT_FAILURE);
}
else{
waitpid(pps,&status,0);
printf("Sending signal to Process %d.\n",pls);
if(kill(pls,SIGINT)<0){//發送SIGINT信號使進程繼續運行命令 /bin/ls.
printf("Error ocurrs while sending a signal to a child process.\n");
exit(EXIT_FAILURE);
}
waitpid(pls,&status,0);
}
}
return 0;
} 併發