定義
pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);
暫時停止程序的執行,直到有信号來到或子程序結束
如果不在意結束狀态值,則參數status 可以設成NULL
pid = wait(NULL);
wait實作
# vi unistd.h
static inline pid_t wait(int * wait_stat)
{
return waitpid(-,wait_stat,);
}
status
由于這些資訊被存放在一個整數的不同二進制位中,是以用正常的方法讀取會非常麻煩,人們就設計了一套專門的宏(macro)來完成這項工作
-
WIFEXITED(status)
子程序正常退出(”exit”或”_exit”),此宏傳回非0
-
WEXITSTATUS(status)
獲得子程序exit()傳回的結束代碼,一般先要用WIFEXITED判斷是否正常結束。如果程序不是正常退出的,也就是說,WIFEXITED傳回0,這個值就毫無意義
-
WIFSIGNALED(status)
若為異常結束子程序傳回的狀态,則為真;對于這種情況可執行WTERMSIG(status),取使子程序結束的信号編号
- WTERMSIG(status) 取得子程序因信号而中止的信号代碼,一般會先用 WIFSIGNALED 來判斷後才使用此宏
- WIFSTOPPED(status) 若為目前暫停子程序傳回的狀态,則為真;對于這種情況可執行WSTOPSIG(status),取使子程序暫停的信号編号
- WSTOPSIG(status) 取得引發子程序暫停的信号代碼,一般會先用 WIFSTOPPED 來判斷後才使用此宏
waitpid
- pid<-1 等待程序組識别碼為 pid 絕對值的任何子程序
- pid=-1 等待任何子程序,相當于 wait()
- pid=0 等待程序組識别碼與目前程序相同的任何子程序
- pid>0 等待任何子程序識别碼為 pid 的子程序
options
- WNOHANG 若pid指定的子程序沒有結束,則waitpid()函數傳回0,不予以等待。若結束,則傳回該子程序的ID
- WUNTRACED 若子程序進入暫停狀态,則馬上傳回,但子程序的結束狀态不予以理會。WIFSTOPPED(status)宏确定傳回值是否對應與一個暫停子程序
舉例
void sig_func(int sig)
{
pid_t pid = ;
int status = ;
pid = wait(&status);
if (WIFEXITED(status))
{
printf("the return code is %d.\n", WEXITSTATUS(status));
}
else
{
printf("the child process %d exit abnormally.\n", pid);
}
}
int main()
{
signal(SIGCHLD, sig_func);
if(fork() == )
{
printf("This is child process with pid of %d.\n", getpid());
exit(EXIT_SUCCESS);
}
while();
return ;
}