- 有3个进程,其中一个为父进程,其余两个是该父进程创建的子进程,其中一个子进程运行“ls -la”指令,另一个子进程在暂停10s内通过kill命令使其异常退出,父进程先用阻塞方式等待第一个子进程的结束,然后用阻塞方式等待第二个子进程的退出,待收集到第二个子进程结束的信息,父进程就返回。
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>
int main(void){
pid_t child1,child2,child,rtn_wait;
int child_stat;
printf("Father:my pid=%d\n",getpid());
//创建子进程child1
child1=fork();
//子进程child1的出错处理
if(child1==-1){
printf("Child1:Fork child1 error!\n");
exit(1);//异常退出
}
//子进程1调用execl()函数
else if(child1==0){
printf("Child1:my pid=%d,my father pid=%d\n",getpid(),getppid());
if(execlp("ls","ls","-l","-a",NULL)<0){
printf("Child1:execl failed!\n");
}
}
else{
//创建子进程child2
child2=fork();
//子进程child2的出错处理
if(child2==-1){
printf("Child2:Fork child2 error!\n");
exit(1);
}
//子进程2暂停10秒
else if(child2==0){
printf("Child2:my pid=%d,my father pid=%d\n",getpid(),getppid());
sleep(10);
exit(0);
}
if(child1>0){
rtn_wait=wait(&child_stat);
if(WIFEXITED(child_stat)==1)
printf("子进程1正常终止,子进程返回值:%d\n",WEXITSTATUS(child_stat));
if(WIFSIGNALED(child_stat)==1)
printf("子进程2非正常终止,结束进程信号:%d\n",WTERMSIG(child_stat));
}
if(child2>0){
rtn_wait=wait(&child_stat);
if(WIFEXITED(child_stat)==1)
printf("子进程2正常终止,子进程返回值:%d\n",WEXITSTATUS(child_stat));
if(WIFSIGNALED(child_stat)==1)
printf("子进程2非正常终止,结束进程信号:%d\n",WTERMSIG(child_stat));
}
}
exit(0);
}
运行结果: