技術(shù)員聯(lián)盟提供win764位系統(tǒng)下載,win10,win7,xp,裝機(jī)純凈版,64位旗艦版,綠色軟件,免費(fèi)軟件下載基地!

當(dāng)前位置:主頁 > 教程 > 服務(wù)器類 >

linux下的進(jìn)程等待

來源:技術(shù)員聯(lián)盟┆發(fā)布時(shí)間:2018-08-30 12:16┆點(diǎn)擊:

  wait(等待子進(jìn)程中斷或結(jié)束)

  表頭文件 #include #include 定義函數(shù) pid_t wait (int * status); 函數(shù)說明: wait()會(huì)暫時(shí)停止目前進(jìn)程的執(zhí)行,直到有信號(hào)來到或子進(jìn)程結(jié)束。 如果在調(diào)用 wait()時(shí)子進(jìn)程已經(jīng)結(jié)束,則 wait()會(huì)立即返回子進(jìn)程結(jié)束狀態(tài)值。 子進(jìn)程的結(jié)束狀態(tài)值會(huì)由參數(shù) status 返回,而子進(jìn)程的進(jìn)程識(shí)別碼也會(huì)一起返回。 如果不在意結(jié)束狀態(tài)值,則參數(shù) status 可以設(shè)成 NULL。 子進(jìn)程的結(jié)束狀態(tài)值請(qǐng)參考 waitpid( ) 如果執(zhí)行成功則返回子進(jìn)程識(shí)別碼(PID) ,如果有錯(cuò)誤發(fā)生則返回返回值-1。失敗原因存于 errno 中。 pid_t pid1; int status=0; i=wait(&status); i返回的是子進(jìn)程的識(shí)別碼;PID status中存的是子進(jìn)程的結(jié)束狀態(tài);可用WEXITSTATUS(status)得到子進(jìn)程的exit(3)的狀態(tài),那么就是3; waitpid(等待子進(jìn)程中斷或結(jié)束) 表頭文件 #include #include 定義函數(shù) pid_t waitpid(pid_t pid,int * status,int options); 函數(shù)說明: waitpid()會(huì)暫時(shí)停止目前進(jìn)程的執(zhí)行,直到有信號(hào)來到或子進(jìn)程結(jié)束。 如果在調(diào)用 wait()時(shí)子進(jìn)程已經(jīng)結(jié)束,則 wait()會(huì)立即返回子進(jìn)程結(jié)束狀態(tài)值。 子進(jìn)程的結(jié)束狀態(tài)值會(huì)由參數(shù) status 返回,而子進(jìn)程的進(jìn)程識(shí)別碼也會(huì)一快返回。 如果不在意結(jié)束狀態(tài)值,則參數(shù) status 可以設(shè)成 NULL。 參數(shù) pid 為欲等待的子進(jìn)程識(shí)別碼,其他數(shù)值意義如下: pid<-1 等待進(jìn)程組識(shí)別碼為 pid 絕對(duì)值的任何子進(jìn)程。 pid=-1 等待任何子進(jìn)程,相當(dāng)于 wait()。 pid=0 等待進(jìn)程組識(shí)別碼與目前進(jìn)程相同的任何子進(jìn)程。 pid>0 等待任何子進(jìn)程識(shí)別碼為 pid 的子進(jìn)程。 參數(shù) option 可以為 0 或下面的 OR 組合: WNOHANG 如果沒有任何已經(jīng)結(jié)束的子進(jìn)程則馬上返回, 不予以等待。 WUNTRACED 如果子進(jìn)程進(jìn)入暫停執(zhí)行情況則馬上返回,但結(jié)束狀態(tài)不予以理會(huì)。 子進(jìn)程的結(jié)束狀態(tài)返回后存于 status,底下有幾個(gè)宏可判別結(jié)束情況: WIFEXITED(status)如果子進(jìn)程正常結(jié)束則為非 0 值。 WEXITSTATUS(status)取得子進(jìn)程 exit()返回的結(jié)束代碼,一般會(huì)先用 WIFEXITED 來判斷是否正常結(jié)束才能使用此宏。 WIFSIGNALED(status)如果子進(jìn)程是因?yàn)樾盘?hào)而結(jié)束則此宏值為真 WTERMSIG(status) 取得子進(jìn)程因信號(hào)而中止的信號(hào)代碼,一般會(huì)先用 WIFSIGNALED 來判斷后才使用此宏。 WIFSTOPPED(status) 如果子進(jìn)程處于暫停執(zhí)行情況則此宏值為真。一般只有使用 WUNTRACED 時(shí)才會(huì)有此情況。 WSTOPSIG(status) 取得引發(fā)子進(jìn)程暫停的信號(hào)代碼,一般會(huì)先用 WIFSTOPPED 來判斷后才使用此宏。 如果執(zhí)行成功則返回子進(jìn)程識(shí)別碼(PID) ,如果有錯(cuò)誤發(fā)生則返回返回值-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 /* 創(chuàng)建子進(jìn)程 */

  17 if((child=fork())==-1)

  18 {

  19 printf("Fork Error n" );

  20 exit(1);

  21 }

  22 else

  23 {

  24 if(child==0) // 子進(jìn)程

  25 {

  26 printf("the child process is runn");

  27 sleep(1); //子進(jìn)程睡眠一秒,但并沒有去運(yùn)行父進(jìn)程

  28 printf("I am the child: %dn", getpid());

  29 exit(0);

  30 }

  31 else //父進(jìn)程

  32 {

  33 wait(NULL); //等到子進(jìn)程退出,父進(jìn)程才會(huì)運(yùn)行

  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

  本例子中,父進(jìn)程等待子進(jìn)程結(jié)束后才執(zhí)行?!?/p>