1. 程式人生 > >linux 進程等待 wait 、 waitpid

linux 進程等待 wait 、 waitpid

popu split var this asc pro 絕對值 scrip ddc

waitpid() 與 wait() 功能相似,都是用戶主進程等待子進程結束或中斷. 可用於進程之間的同步

wait 函數原型

pid_t wait(int *status);

函數說明
wait() 會臨時停止眼下進程的運行,直到有信號來到或子進程結束.假設在調用wait() 時子進程已經結束,則 wait() 會立即返回子進程結束狀態值.子進程的結束狀態值會由參數 status 返回,而子進程的進程識別碼也會一塊返回.假設不在意結束狀態值,則參數ststus能夠設為 NULL.子進程的結束狀態值請參考以下的waitpid().

返回值
假設運行成功則返回子進程識別碼(PID), 假設有發生錯誤則返回 -1, 失敗原因存於 errno 中.

演示樣例代碼:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>

int main(int argc, char *argv[])
{
    pid_t pid;
    int status, i;
    if(fork() == 0) {
        printf("This is the child process pid = %d\n",getpid());
        exit
(5); } else { sleep(1); printf("This is the parent process , wait for child...\n"); pid = wait(&status); i = WEXITSTATUS(status); printf("child‘s pid = %d. exit status = %d\n", pid, i); } return 0; }

waitpid 函數原型

pid_t waitpid(pid_t pid, int
*status, int options);

函數說明
waitpid() 會臨時停止眼下進程的運行,直到有信號來到或子進程結束. 假設在調用 waitpid() 時子進程已經結束,則 waitpid() 會立即返回子進程結束狀態值. 子進程的結束狀態值會由參數 status 返回,而子進程的進程識別碼也會一塊返回.假設不在意結束狀態值,則參數ststus能夠設為NULL.參數pid為欲等待的子進程識別碼.其數值意義例如以下:

pid > 0 時,僅僅等待進程id等於pid的子進程,無論其他已經有多少子進程運行結束退出,僅僅要指定的子進程還沒有結束,waitpid就會一直等下去.

pid = -1 時,等待不論什麽一個子進程退出,沒有不論什麽限制,此時 waitpidwait 的作用一模一樣.

pid = 0 時,等待統一進程組中的不論什麽子進程,假設子進程已經增加了別的進程組,waitpid 不會對它做不論什麽理睬.

pid < -1 時, 等待一個指定進程組中的不論什麽子進程,這個進程組的ID等於pid的絕對值。

參數 options 的值有以下幾種類型:

WNOHANG 假設沒有不論什麽已經結束的子進程則立即返回, 不予以等待。  

WUNTRACED 假設子進程進入暫停運行情況則立即返回,但結束狀態不予以理會。

假設不用以上兩個宏。還能夠用 0 作為第三個參數傳入。

註: wait() 函數就是經過包裝的 waitpid(),查看 <內核源代碼文件夾>/include/unistd.h 文件 就能夠看到例如以下程序段

static inline pid_t wait(int *wait_stat)
{
    return waitpid(-1,wait_stat,0);
}

返回值
當正常返回的時候 waitpid 返回收集到的子進程的ID;
假設設置了 WNOHANG, 而調用中waitpid 發現沒有已退出的子進程可收集,則返回0;
假設調用中出錯,則返回-1,並重置errno的值。

子進程的結束狀返回後存於 status,地下有幾個宏可判別結束情況
WNOHANG 假設沒有不論什麽已經結束的子進程則立即返回, 不予以等待。

  

WUNTRACED 假設子進程進入暫停運行情況則立即返回,但結束狀態不予以理會。

  

子進程的結束狀態返回後存於 status,底下有幾個宏可判別結束情況:  

WIFEXITED(status)假設子進程正常結束則為非 0 值。  

WEXITSTATUS(status)取得子進程 exit()返回的結束代碼,通常會先用

WIFEXITED 來推斷是否正常結束才幹使用此宏。  

WIFSIGNALED(status)假設子進程是由於信號而結束則此宏值為真  

WTERMSIG(status) 取得子進程因信號而中止的信號代碼,通常會先用 WIFSIGNALED 來推斷後才使用此宏。  

WIFSTOPPED(status) 假設子進程處於暫停運行情況則此宏值為真。

一般僅僅有使用 WUNTRACED 時才會有此情況。  

WSTOPSIG(status) 取得引發子進程暫停的信號代碼,通常會先用 WIFSTOPPED 來推斷後才使用此宏。

演示樣例代碼:

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
main()
{
    pid_t pc, pr;
    pc=fork();
    if(pc<0)
        printf("Error occured on forking.\n");
    else if(pc==0) {
        sleep(10);
        exit(0);
    }
    do {
        pr=waitpid(pc, NULL, WNOHANG);
        if(pr==0) {
            printf("No child exited\n");
            sleep(1);
        }
    } while(pr==0);
    if(pr==pc)
        printf("successfully get child %d\n", pr);
    else
        printf("some error occured\n");

}

linux 進程等待 wait 、 waitpid