C語言wait()函數:結束(中斷)程序函數(常用)
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait (int * status);
函數說明:wait()會暫時停止目前程序的執行, 直到有信号來到或子程序結束. 如果在調用wait()時子程序已經結束, 則wait()會立即傳回子程序結束狀态值. 子程序的結束狀态值會由參數status 傳回, 而子程序的程序識别碼也會一快傳回. 如果不在意結束狀态值, 則參數 status 可以設成NULL. 子程序的結束狀态值請參考waitpid().
傳回值:如果執行成功則傳回子程序識别碼(PID), 如果有錯誤發生則傳回-1. 失敗原因存于errno 中.
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
main()
{
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);
}
}
This is the child process. pid=1501
This is the parent process, wait for child...
child's pid =1501, exit status =5
C語言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 為欲等待的子程序識别碼, 其他數值意義如下:
1、pid<-1 等待程序組識别碼為pid 絕對值的任何子程序.
2、pid=-1 等待任何子程序, 相當于wait().
3、pid=0 等待程序組識别碼與目前程序相同的任何子程序.
4、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 中.
範例:參考wait().
注:
從本質上講,系統調用waitpid和wait的作用是完全相同的,但waitpid多出了兩個可由使用者控制的參數pid和options,進而為我們程式設計提供了另一種更靈活的方式。