1. wait()和waitpid()函数说明
运行截图如下:
运行截图如下:
wait()
进程一旦调用了wait(), 就立即阻塞自己,由wait自动分析是否有当前进程的某个子进程已经退出,如果让它找到了一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到一个子进程结束或者该进程接到了一个指定的信号为止。
waitpid()
waitpid()的作用和wait()一样,但它并不一定要等待第一个终止的子进程,它还有若干选项,如可提供一个非阻塞版本的wait()功能等。实际上wait()函数只是waitpid()函数的一个特例,在Linux内部实现wait()函数时直接调用的就是waitpid()函数。
wait()函数的实现:
static inline pid_t wait(int *wait_stat)
{
return waitpid(-1,wait_stat,0);
}
2. wait()和waitpid()函数格式说明
(1) wait()函数格式如下:
wait()举例
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main()
{
int status;
pid_t pc,pr;
pc=fork();
if(pc<0)
{
printf("error ocurred!\n");
}
else if(0==pc)
{
printf("this is child process whit pid of %d\n",getpid());
exit(3);
}
else
{
pr=wait(&status);
if (WIFEXITED(status))
{
printf("the child process %d exit normally.\n",pr);
printf("the return code is %d.\n",WEXITSTATUS(status));
}
else
{
printf("the child process %d exit abnormally.\n",pr);
}
}
return 0;
}
运行截图如下:
(2) waitpid()函数格式如下
waitpid()举例
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>
int main(void)
{
pid_t pc,pr;
pc=fork();
if(pc<0)
{
printf("Error fork \n");
}
else if(pc==0)
{
sleep(5);
exit(0);
}
else
{
do
{
pr=waitpid(pc,NULL,WNOHANG);
if(pr==0)
{
printf("The child process has not exited \n");
sleep(1);
}
}while(pr==0);
if(pr==pc)
{
printf("Get child exit code: %d\n ",pr);
}
else
{
printf("Some error occured. \n");
}
}
return 0;
}
运行截图如下:
本例中首先使用fork()创建一个子进程,然后让其子进程暂停5s(使用了sleep()函数)。
接下来对原有的父进程使用waitpid()函数,并使用参数WNOHANG使该父进程不阻塞。
若有子进程退出,则waitpid()返回子进程号;
若没有子进程退出,则waitpid()返回0,并且父进程每隔一秒循环判断一次。
程序的流程图如下图: