waitpid函数原型如下:
pid_t waitpid(pid_t pid , int *status , int options)
与wait函数相比,系统调用二者的作用是完全相同的,但是waitpid多出了两个可由用户控制的参数pid和options。
pid:从参数的名字上可以看出来这是一个进程的ID。但是这里pid的值不同时,会有不同的意义。
1.pid > 0时,只等待进程ID等于pid的子进程,只要该子进程不结束,就会一直等待下去;
2.pid = -1时,等待任何一个子进程的退出,此时作用和wait相同;
3.pid = 0时,等待同一个进程组中的任何子进程;
4.pid < -1时,等待一个指定进程组中的任何子进程,这个进程组的ID等于pid的绝对值。
options:options提供了一些额外的选项来控制waitpid,例如WNOHANG和WUNTRACED这两个选项,这是两个常数,可以使用 “|”来链接起来使用,比如:
ret = waitpid(-1,NULL,WNOHANG | WUNTRACED);
如果不想使用这两个选项,可以设置为0,如果选择使用了WNOHANG参数调用waitpid,即使没有子进程退出,它也会立刻返回,而不像wait那样永远等待。
waitpid的返回值一共有三种情况:
1.当返回正常时,waitpid返回收集到的子进程的进程ID;
2.如果设置了WNOHANG,而调用中waitpid发现自己没有已退出的子进程可收集,则返回0;
3.如果在调用中出现错误,则返回-1,同时errno会被设置成相应的值来提示错误。
运行程序:
父进程在经历过10次失败的尝试后,终于收集到了退出的子进程。
这程序中,让父进程和子进程分别睡眠了10秒钟和1秒钟,代表他们分别做出了10秒钟和1秒钟的工作,父子进程都有工作要做,父进程利用工作间歇查看子进程是否退出,如果退出就收集它。
这里我们把第23行改为waitpid(pc,NULL,0):
重新运行后发现:修该后父进程将自己阻塞,直到有子进程退出为止。