Linux wait函數詳解

wait和waitpid出現的緣由
SIGCHLD
--當子進程退出的時候,內核會向父進程SIGCHLD信號,子進程的退出是個異步事件(子進程能夠在父進程運行的任什麼時候刻終止)
--子進程退出時,內核將子進程置爲殭屍狀態,這個進程成爲殭屍進程,它只保留最小的一些內核數據結構,以便父進程查詢子進程的退出狀態
--父進程查詢子進程的退出狀態能夠用wait/waitpid函數
wait獲取staus後檢測處理
宏定義  描述
WIFEXITED(status) 若是進程子進程正常結束,返回一個非零值
    WEXITSTATUS(status) 若是WIFEXITED非零,返回子進程退出碼
WIFSIGNALED(status) 子進程由於捕獲信號而終止,返回非零值
    WTERMSIG(status) 若是WIFSIGNALED非零,返回信號代碼
WIFSTOPPED(status) 若是進程被暫停,返回一個非零值
    WSTOPSIG(status) 若是WIFSTOPPED非零,返回信號代碼
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(int arg,char *args[])
{
    pid_t pid=fork();
    if(pid==-1)
    {
        printf("fork() failed ! error message:%s\n",strerror(errno));
        return -1;
    }
    if(pid>0)
    {
        int status=0;
        printf("父進程\n");
        wait(&status);
        if(WIFEXITED(status))//WIFEXITED宏的釋義: wait if exit ed
        {
            printf("子進程返回信息碼:%d\n",WEXITSTATUS(status));
        }else if(WIFSIGNALED(status))
        {
            printf("子進程信號中斷返回信息碼:%d\n",WTERMSIG(status));
        }else if(WIFSTOPPED(status))
        {
            printf("子進程暫停返回信息碼:%d\n",WSTOPSIG(status));
        }else
        {
            printf("其餘退出信息!\n");
        }
    }else if(pid==0)
    {
        printf("i am child !\n");
        abort();
        //exit(100);
    }
    printf("game is over!\n");
    return 0;
}
wait()函數成功返回等待子進程的pid,失敗返回-1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(int arg, char *args[])
{
    pid_t pid = 0;
    int i = 0, ret = 0;
    for (i = 0; i < 10; i++)
    {
        pid = fork();
        if (pid == -1)
        {
            printf("fork() failed ! error message:%s\n", strerror(errno));
            return -1;
        }
        if (pid == 0)
        {
            printf("child haved run!\n");
            exit(0);
        }
    }
    while (1)
    {
        //wait()函數的返回值是子進程的pid
        ret = wait(NULL);
        printf("子進程pid=%d\n", ret);
        if (ret == -1)
        {
            //父進程wait()函數阻塞過程當中,有可能被別的信號中斷,須要作異常處理
            if (errno == EINTR)
            {
                continue;
            }
            break;
        }
    }
    printf("game is over!\n");
    return 0;
}

 

waitpid
函數功能:用來等待某個特定進程的結束
函數原型:
    pid_t waitpid(pid_t pid, int *status, int options);
參數:
    status若是不爲空,會把狀態信息寫到它指向的位置
    options容許改變waitpid的行爲,最有用的一個選項是WNOHANG,它的做用是防止waitpid把調用者的執行掛起
返回值:成功返回等待子進程的pid,失敗返回-1
相關文章
相關標籤/搜索