waitpid()
waitpid()會暫時停止目前程式的執行,直到有訊號來到或子程式結束。
- 中文名
- waitpid
- 定 義
- 數學函式
- 釋 義
- 函式名詞
- 說 明
- pid<-1
表標頭檔案
編輯#include<sys/types.h>
#include<sys/wait.h>
定義函式 pid_t waitpid(pid_t pid,int * status,int options);
函式說明
編輯如果在呼叫 waitpid()時子程式已經結束,則 waitpid()會立即
返回子程式結束狀態值。 子程式的結束狀態值會由引數 status 返回,
而子程式的程式識別碼也會一起返回。如果不在意結束狀態值,則
引數 status 可以設成 NULL。引數 pid 為欲等待的子程式識別碼,
其他數值意義如下:
pid<-1 等待程式組識別碼為 pid 絕對值的任何子程式。
pid=-1 等待任何子程式,相當於 wait()。
pid=0 等待程式組識別碼與目前程式相同的任何子程式。
pid>0 等待任何子程式識別碼為 pid 的子程式。
引數options提供了一些額外的選項來控制waitpid,引數 option 可以為 0 或可以用"|"運算子把它們連線起來使用,比如:
ret=waitpid(-1,NULL,WNOHANG | WUNTRACED);
如果我們不想使用它們,也可以把options設為0,如:
ret=waitpid(-1,NULL,0);
WNOHANG 若pid指定的子程式沒有結束,則waitpid()函式返回0,不予以等待。若結束,則返回該子程式的ID。
WUNTRACED 若子程式進入暫停狀態,則馬上返回,但子程式的結束狀態不予以理會。WIFSTOPPED(status)巨集確定返回值是否對應與一個暫停子程式。
子程式的結束狀態返回後存於 status,底下有幾個巨集可判別結束情況:
WIFEXITED(status)如果若為正常結束子程式返回的狀態,則為真;對於這種情況可執行WEXITSTATUS(status),取子程式傳給exit或_eixt的低8位。
WEXITSTATUS(status)取得子程式 exit()返回的結束程式碼,一般會先用 WIFEXITED 來判斷是否正常結束才能使用此巨集。
WIFSIGNALED(status)若為異常結束子程式返回的狀態,則為真;對於這種情況可執行WTERMSIG(status),取使子程式結束的訊號編號。
WTERMSIG(status) 取得子程式因訊號而中止的訊號程式碼,一般會先用 WIFSIGNALED 來判斷後才使用此巨集。
WIFSTOPPED(status) 若為當前暫停子程式返回的狀態,則為真;對於這種情況可執行WSTOPSIG(status),取使子程式暫停的訊號編號。
WSTOPSIG(status) 取得引發子程式暫停的訊號程式碼,一般會先用 WIFSTOPPED 來判斷後才使用此巨集。
如果執行成功則返回子程式識別碼(PID) ,如果有錯誤發生則返回
返回值-1。失敗原因存於 errno 中。
示例程式碼
編輯
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
/****** * waitpid.c - Simple wait usage *********/ #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <stdio.h> #include <stdlib.h> int main( void ) { pid_t childpid; int status; childpid = fork(); if ( childpid < 0 ) { perror ( "fork()" ); exit ( EXIT_FAILURE ); } else if ( childpid == 0 ) { puts ( "In child process" ); sleep( 3 ); //讓子程式睡眠3秒,看看父程式的行為 printf ( "\tchild pid = %d\n" , getpid()); printf ( "\tchild ppid = %d\n" , getppid()); exit (EXIT_SUCCESS); } else { waitpid( childpid, &status, 0 ); puts ( "in parent" ); printf ( "\tparent pid = %d\n" , getpid() ); printf ( "\tparent ppid = %d\n" , getppid() ); printf ( "\tchild process exited with status %d \n" , status ); } exit (EXIT_SUCCESS); } |
1
2
3
4
5
6
7
8
9
10
|
[root@localhost src] # gcc waitpid.c [root@localhost src] # ./a.out In child process child pid = 4469 child ppid = 4468 in parent parent pid = 4468 parent ppid = 4379 child process exited with status 0 [root@localhost src] # |
如果將上面“waitpid( childpid, &status, 0 );”行註釋掉,程式執行效果如下:
1
2
3
4
5
6
7
8
|
[root@localhost src] # ./a.out In child process in parent parent pid = 4481 parent ppid = 4379 child process exited with status1 [root@localhost src] # child pid = 4482 child ppid = 1 |
子程式還沒有退出,父程式已經退出了。