歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Linux下的進程等待(wait和waitpid)

Linux下的進程等待(wait和waitpid)

日期:2017/3/1 9:47:05   编辑:Linux編程

wait(等待子進程中斷或結束)

表頭文件
#include<sys/types.h>
#include<sys/wait.h>
定義函數 pid_t wait (int * status);
函數說明:
wait()會暫時停止目前進程的執行,直到有信號來到或子進程結束。
如果在調用 wait()時子進程已經結束,則 wait()會立即返回子進程結束狀態值。
子進程的結束狀態值會由參數 status 返回,而子進程的進程識別碼也會一起返回。
如果不在意結束狀態值,則參數 status 可以設成 NULL。
子進程的結束狀態值請參考 waitpid( )
如果執行成功則返回子進程識別碼(PID) ,如果有錯誤發生則返回返回值-1。失敗原因存於 errno 中。
pid_t pid1; int status=0;
i=wait(&status);
i返回的是子進程的識別碼;PID
status中存的是子進程的結束狀態;可用WEXITSTATUS(status)得到子進程的exit(3)的狀態,那麼就是3;

waitpid(等待子進程中斷或結束)
表頭文件
#include<sys/types.h>
#include<sys/wait.h>
定義函數 pid_t waitpid(pid_t pid,int * status,int options);
函數說明:
waitpid()會暫時停止目前進程的執行,直到有信號來到或子進程結束。
如果在調用 wait()時子進程已經結束,則 wait()會立即返回子進程結束狀態值。
子進程的結束狀態值會由參數 status 返回,而子進程的進程識別碼也會一快返回。
如果不在意結束狀態值,則參數 status 可以設成 NULL。

參數 pid 為欲等待的子進程識別碼,其他數值意義如下:
pid<-1 等待進程組識別碼為 pid 絕對值的任何子進程。
pid=-1 等待任何子進程,相當於 wait()。
pid=0 等待進程組識別碼與目前進程相同的任何子進程。
pid>0 等待任何子進程識別碼為 pid 的子進程。

參數 option 可以為 0 或下面的 OR 組合:
WNOHANG 如果沒有任何已經結束的子進程則馬上返回, 不予以等待。
WUNTRACED 如果子進程進入暫停執行情況則馬上返回,但結束狀態不予以理會。

子進程的結束狀態返回後存於 status,底下有幾個宏可判別結束情況:
WIFEXITED(status)如果子進程正常結束則為非 0 值。
WEXITSTATUS(status)取得子進程 exit()返回的結束代碼,一般會先用 WIFEXITED 來判斷是否正常結束才能使用此宏。
WIFSIGNALED(status)如果子進程是因為信號而結束則此宏值為真
WTERMSIG(status) 取得子進程因信號而中止的信號代碼,一般會先用 WIFSIGNALED 來判斷後才使用此宏。
WIFSTOPPED(status) 如果子進程處於暫停執行情況則此宏值為真。一般只有使用 WUNTRACED 時才會有此情況。
WSTOPSIG(status) 取得引發子進程暫停的信號代碼,一般會先用 WIFSTOPPED 來判斷後才使用此宏。
如果執行成功則返回子進程識別碼(PID) ,如果有錯誤發生則返回返回值-1。失敗原因存於 errno 中。

[email protected]:/home/linuxidc/桌面/c++# cat -n wait.cpp
1 #include <unistd.h>
2 #include <sys/types.h>
3 #include <sys/wait.h>
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <errno.h>
7 #include <math.h>
8
9 /*
10 * 程序入口
11 * */
12 int main(void)
13 {
14 pid_t child;
15
16 /* 創建子進程 */
17 if((child=fork())==-1)
18 {
19 printf("Fork Error \n" );
20 exit(1);
21 }
22 else
23 {
24 if(child==0) // 子進程
25 {
26 printf("the child process is run\n");
27 sleep(1); //子進程睡眠一秒,但並沒有去運行父進程
28 printf("I am the child: %d\n", getpid());
29 exit(0);
30 }
31 else //父進程
32 {
33 wait(NULL); //等到子進程退出,父進程才會運行
34 printf("the father process is run\n");
35 printf("I am the father:%d\n",getpid());
36 return 0;
37 }
38 }
39 }
40
41
[email protected]:/home/linuxidc/桌面/c++# g++ wait.cpp -o wait
[email protected]:/home/linuxidc/桌面/c++# ./wait
the child process is run
I am the child: 19742
the father process is run
I am the father:19741
[email protected]:/home/linuxidc/桌面/c++# ./wait

本例子中,父進程等待子進程結束後才執行。~

Copyright © Linux教程網 All Rights Reserved