#include<sys/types.h>
#include<sys/wait.h>
pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);
特殊參數和返回情況:
參數pid:
>0 回收指定ID的子進程
-1 回收任意子進程(相當於wait)
0 回收和當前調用waitpid一個組的所有子進程
< -1 回收指定進程組內的任意子進程
返回0:參數3爲WNOHANG,且子進程正在運行。
若調用成功則返回清理掉的子進程的id,若調用出錯則返回-1。父進程調用wait或者waitpid時可能會:
1.阻塞(如果它的所有子進程都還在運行)
2.帶子進程的終止信息立即返回(如果一個子進程已終止,正等待父進程讀取其終止信息)
3.出錯立即返回(如果它沒有任何子進程)
這兩個函數的區別是:
如果父進程的所有子進程都還在運行,調用wait將使父進程阻塞,而調用waitpid時如果在options參數中指定WNOHANG可以使父進程不阻塞而立即返回0
wait等待第一個終止的子進程,而waitpid可以通過pid參數指定等待哪一個子進程
注意:一次wait或waitpid調用只能清理一個子進程,清理多個子進程需要用到循環
可見,調用wait和waitpid不僅可以獲得子進程的信息,還可以使父進程阻塞等待子進程終止,起到進程間同步的作用。如果參數status不是空指針,則子進程的終止信息通過這個參數傳出,如果只是爲了同步而不關心子進程的終止信息,
可以將status參數指定爲NULL
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
pid_t pid;
pid = fork();
if (pid < 0)
{
perror("fork failed");
exit(1);
}
if (pid == 0)
{
int i;
for (i = 3; i > 0; i--)
{
printf("This is the child\n");
sleep(1);
}
exit(3);
}
else
{
int stat_val;
waitpid(pid, &stat_val, 0);
if (WIFEXITED(stat_val))
printf("Child exited with code %d\n", WEXITSTATUS(stat_val));
else if (WIFSIGNALED(stat_val))
printf("Child terminated abnormally, signal %d\n", WTERMSIG(stat_val));
}
return 0;
}