上一节说道,父进程需要处理子进程结束后的善后工作,怎么善后呢? 就是 wait() / waitpid()
这里只是简单的使用 wait()
waitpid()以及各个判断终止状态宏的使用 还需要研究
NAME
wait, waitpid, waitid - wait for process to change state 等待进程更改状态
SYNOPSIS
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);
int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);
RETURN VALUE
wait(): on success, returns the process ID of the terminated child; on error, -1 is returned.
成功返回 终止的子进程 的 进程ID ,失败返回-1
wait 使用:
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/wait.h>
#define LEFT 200
#define RIGHT 250
int main(void)
{
int i,j,mark;
pid_t pid;
for(i = LEFT; i <= RIGHT; i++)
{
pid = fork();
if(pid < 0)
{
fprintf(stderr,"fork() failed!\n");
exit(1);
}
else if(pid == 0)//child
{
mark = 1;
for(j = 2; j < i/2; j++)
{
if(i % j ==0)
{
mark = 0;
break;
}
}
if(mark)
printf("%d is a primer\n",i);
exit(0);//!!!
}
}
sleep(1000);
exit(0);
}
此时 201个子进程 是僵死进程 父进程为init
添加 wait() 善后处理后:
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/wait.h>
#define LEFT 200
#define RIGHT 250
int main(void)
{
int i,j,mark;
pid_t pid;
for(i = LEFT; i <= RIGHT; i++)
{
pid = fork();
if(pid < 0)
{
fprintf(stderr,"fork() failed!\n");
exit(1);
}
else if(pid == 0)//child
{
mark = 1;
for(j = 2; j < i/2; j++)
{
if(i % j ==0)
{
mark = 0;
break;
}
}
if(mark)
printf("%d is a primer\n",i);
exit(0);//!!!
}
}
for(i = LEFT;i <= 250; i++)
wait(NULL);
sleep(1000);
exit(0);
}
此时 ps axf 就没有了 变成僵死进程的子进程,只剩下一个父进程了。