一个父进程创建了三个子进程,三个子进程分别以不同的状态停止运行,通过宏获取当前子进程的结束状态。
main.cpp
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <stdio.h>
void out_status(int status)
{
if(WIFEXITED(status))
{
printf("normal exti: %d\n", WEXITSTATUS(status));
}
else if(WIFSIGNALED(status))
{
printf("abnormal term: %d\n", WTERMSIG(status));
}
else if(WIFSTOPPED(status))
{
printf("stopped sig: %d\n", WSTOPSIG(status));
}
else
{
printf("unkown sig\n");
}
}
int main(void)
{
int status;
pid_t pid;
if((pid = fork()) < 0)
{
perror("forlk error");
exit(1);
}
else if(pid == 0)
{
printf("pid: %d, ppid: %d\n", getpid(), getppid());
exit(3);//子进程停止运行
}
//父进程调用wait阻塞,等待子进程终止并回收
wait(&status);
out_status(status);
printf("-------------------------------------\n");
if((pid = fork()) < 0)
{
perror("fork error");
exit(1);
}
else if(pid == 0)
{
printf("pid: %d, ppid: %d\n", getpid(), getppid());
int i = 3;
int j = 0;
int k = i / j; //除零操作
printf("k: %d\n", k);
}
wait(&status);
out_status(status);
printf("-----------------------------------\n");
if((pid = fork()) < 0)
{
perror("fork error");
exit(1);
}
else if(pid == 0)
{
printf("pid: %d, ppid: %d\n", getpid(), getppid());
pause();//暂停
}
do
{
//如果返回的是0,说明子进程没有结束,如果子进程结束返回的是子进程pid
pid = waitpid(pid, &status, WNOHAND | WUNTRACED);//非阻塞方式
if(pid == 0)//子进程没有结束
{
sleep(1);//父进程睡眠
}
}while(pid == 0);
out_status(status);
printf("-----------------------------------\n");
return 0;
}
执行程序,并对第三个子进程发生终止信号:
若对第三个进程发送暂停信号,然后再发送终止信号,如果在这种情况下使用的是wait函数,则第三个进程不会被终止,因此在上面的代码中我们使用了waitpid函数。