wait(等待子進程中斷或結束)
表頭文件 #include #include 定義函數 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 #include 定義函數 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 中。
oot@wl-MS-7673:/home/wl/桌面/c++# cat -n wait.cpp
1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
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 runn");
27 sleep(1); //子進程睡眠一秒,但並沒有去運行父進程
28 printf("I am the child: %dn", getpid());
29 exit(0);
30 }
31 else //父進程
32 {
33 wait(NULL); //等到子進程退出,父進程才會運行
34 printf("the father process is runn");
35 printf("I am the father:%dn",getpid());
36 return 0;
37 }
38 }
39 }
40
41
root@wl-MS-7673:/home/wl/桌面/c++# g++ wait.cpp -o wait
root@wl-MS-7673:/home/wl/桌面/c++# ./wait
the child process is run
I am the child: 19742
the father process is run
I am the father:19741
root@wl-MS-7673:/home/wl/桌面/c++# ./wait
本例子中,父進程等待子進程結束後才執行。~