wait/waitpid函數詳解

#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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章