linux 進程等待 wait 、 waitpid
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 時,等待不論什麽一個子進程退出,沒有不論什麽限制,此時 waitpid 和 wait 的作用一模一樣.
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