1.进程的等待
wait函数或waitpid进程可能发生如下情况;
(1)如果所有的子进程孩子运行,则阻塞(Block)
(2)如果一个子进程已经终止,正等待父进程获取其终止状态,则取得孩子进程的终止状态返回
(3)如果她没有任何子进程,则立即出错返回
函数的原型:
#include <sys/wait.h>
pid_t wait(int *status);
说明:wait函数会暂时停止目前进程执行,直到有信号来到或者子进程结束。如果在调用wait时,子进程已经结束,则wait会立即返回子进程的结束状态值。如果不在意子进程的返回状态,可将参数status设为NULL。若成功返回子进程识别码(PID),若有错误发生则返回-1.
pid_t waitpid(pid_t pid,int *status,int options);
说明:
返回值:若成功返回进程ID,若出错返回-1.waitpid会暂停目前的进程执行,直到有信号或者子进程结束。
如果不在意结束时状态值,则status可以设成NULL.参数pid为欲等待的子进程识别码,其他值意义如下:
(1)pid < -1 等待进程组识别码为pid绝对值的任何子进程
(2)pid = -1等待任何子进程,此时就相当于wait()
(3)pid = 0等待进程组识别码与目前进程相同的任何子进程
(4)pid > 0等待任何子进程识别码为pid的子进程
参数options可以设为0 或者与下面的组合:
(1)WNOHANG 若没有任何已经结束的子进程则马上返回,不等待
(2)WUNTRACED如果子进程进入暂停执行情况马上返回,但结束的状态不予理会
2.wait和waitpid的区别:
(1)在任何一个子进程终止前,wait使其调用者阻塞,而waitpid有一个选项,可以使调用者不阻塞。
(2)waitpid并不等待在其调用之后的第一个终止的子进程。它若有若干个选项,可以控制它所等待的进程。如果一个子进程已经终止,并且是僵死进程,wait函数立即返回并取得该子进程的状态,否则wait使其调用者阻塞直到一个子进程终止。如果调用者阻塞并有多个子进程时,则在一个子进程终止时,wait立即返回,因为wait返回终止子进程的ID。
僵死进程:一个已经终止,但是父进程尚未对其进行善后处理(获得终止子进程的有关信息,并且释放资源)的进程被称为僵死进程。
例子参看linux代码。