一、表头文件:
#include <sys/types.h>
#include <sys/wait.h>
二、定义函数:
pid_t waitpid (pid_t pid, int * status, int options)
三、函数说明:
waitpid()会暂停目前进程的执行,直到有信号来到或子进程结束。如果在调用wait()时子进程已经结束,则wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数status返回,而且子进程的进程识别码也会一起返回。如果不在意结束状态值,则参数status可以设为NULL。参数pid为欲等待的子进程识别码,其数值意义如下:
pid<-1 等待进程组识别码为pid绝对值的任何子进程。
pid=-1 等待任何子进程,相当于wait()。
pid=0 等待进程组识别码与目前进程相同的任何子进程。
pid>0 等待任何子进程识别码为pid的子进程。
参数option可以为0 或下面的OR 组合WNOHANG: 如果没有任何已经结束的子进程则马上返回,不予以等待。
WUNTRACED :如果子进程进入暂停执行情况则马上返回,但结束状态不予以理会。
返回值:如果执行成功则返回子进程识别码(PID),如果有错误发生则返回-1。失败原因存于errno中。
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
void die(const char *msg)
{
perror(msg);
exit(1);
}
void child2_do()
{
printf("In child2: execute'date'\n");
sleep(5);
if(execlp("date", "date", NULL) < 0)
{
perror("child2 execlp");
}
}
void child1_do(pid_t child2, char *argv)
{
pid_t pw;
do
{
if(*argv = '1')
{
pw = waitpid(child2, NULL, 0);
}
else
{
pw = waitpid(child2, NULL, WNOHANG);
}
if(pw == 0)
{
printf("In child1 process:\nThe child2 process has not exited!\n");
sleep(1);
}
}while(pw == 0);
if(pw == child2)
{
printf("Get child2 %d.\n", pw);
sleep(5);
if(execlp("pwd", "pwd", NULL) < 0)
{
perror("child1 execlp");
}
}
else
{
printf("error occurred!\n");
}
}
void father_do(pid_t child1, char *argv)
{
pid_t pw;
do
{
if(*argv = '1')
{
pw = waitpid(child1, NULL, 0);
}
else
{
pw = waitpid(child1, NULL, WNOHANG);
}
if(pw == 0)
{
printf("In father process:\nThe child1 process has not exited!\n");
sleep(1);
}
}while(pw == 0);
if(pw == child1)
{
printf("Get child1 %d.\n", pw);
sleep(5);
if(execlp("ls", "ls", "-l", NULL) < 0)
{
perror("father execlp");
}
}
else
{
printf("error occurred!\n");
}
}
int main(int argc, char *argv[])
{
pid_t child1, child2;
if(argc < 3)
{
printf("Usage:waitpid [0 1][0 1]\n");
exit(1);
}
child1 = fork();
if(child1 < 0)
{
die("child1 fork");
}
else if(child1 == 0)
{
child2 = fork();
if(child2 < 0)
{
die("child2 fork");
}
else if(child2 == 0)
{
child2_do();
}
else
{
child1_do(child2, argv[1]);
}
}
else
{
father_do(child1, argv[2]);
}
return 0;
}