linux之wait函數



#include<sys/types.h>

#include<sys/wait.h>

pid_t wait(int *status);

進程一旦調用了wait就立即阻塞自己,由wait自動分析是否當前進程的某個子進程已經退出,如果讓它找到了這樣一個已經變成殭屍的子進程,wait就會收集這個子進程的信息,並把它徹底銷燬後返回;如果沒有找到這樣一個子進程,wait就會一直阻塞在這裏,直到有一個出現爲止。

參數status用來保存被收集進程退出時的一些狀態,它是一個指向int類型的指針。但如果我們對這個子進程是如何死掉毫不在意,只想把這個殭屍進程消滅掉,(事實上絕大多數情況下,我們都會這樣想),我們就可以設定這個參數爲NULL,就像下面這樣:

pid = wait(NULL);

如果成功,wait會返回被收集的子進程的進程ID,如果調用進程沒有子進程,調用就會失敗,此時wait返回-1,同時errno被置爲ECHILD。

wait調用例程:

/* wait1.c */

#include <sys/types.h>

#include <sys/wait.h>

#include <unistd.h>

#include <stdlib.h>

main()

{

        pid_t pc,pr;

        pc=fork();

 

        if(pc<0) /* 如果出錯 */

               printf("error ocurred!/n");

       else if(pc==0){ /* 如果是子進程 */

               printf("This is child process with pid of %d/n",getpid());

              sleep(10); /* 睡眠10秒鐘 */

            }

        else{ /* 如果是父進程 */

               pr=wait(NULL); /* 在這裏等待 */

              printf("I catched a child process with pid of %d/n"),pr);

        }

       exit(0);

}

編譯並運行:

$ gcc wait1.c -o wait1

$ ./wait1

This is child process with pid of 1508

I catched a child process with pid of 1508

可以明顯注意到,在第2行結果打印出來前有10 秒鐘的等待時間,這就是我們設定的讓子進程睡眠的時間,只有子進程從睡眠中甦醒過來,它才能正常退出,也就才能被父進程捕捉到。其實這裏我們不管設定子進程睡眠的時間有多長,父進程都會一直等待下去,讀者如果有興趣的話,可以試着自己修改一下這個數值,看看會出現怎樣的結果。

進程同步:

   有時候,父進程要求子進程的運算結果進行下一步的運算,或者子進程的功能是爲父進程提供了下一步執行的先決條件(如:子進程建立文件,而父進程寫入數據),此時父進程就必須在某一個位置停下來,等待子進程運行結束,而如果父進程不等待而直接執行下去的話,可以想見,會出現極大的混亂。這種情況稱爲進程之間的同步,更準確地說,這是進程同步的一種特例。進程同步就是要協調好2個以上的進程,使之以安排好地次序依次執行。解決進程同步問題有更通用的方法,我們將在以後介紹,但對於我們假設的這種情況,則完全可以用wait系統調用簡單的予以解決。請看下面這段程序:

#include <sys/types.h>

#include <sys/wait.h>

main()

{

        pid_t pc, pr;

        int status;

 

        pc=fork();

 

       if(pc<0)

               printf("Error occured on forking./n");

        else if(pc==0){

                /* 子進程的工作 */

                exit(0);

        }else{

               /* 父進程的工作 */

               pr=wait(&status);

              /* 利用子進程的結果 */

        }

}

這段程序只是個例子,不能真正拿來執行,但它卻說明了一些問題,首先,當fork調用成功後,父子進程各做各的事情,但當父進程的工作告一段落,需要用到子進程的結果時,它就停下來調用wait,一直等到子進程運行結束,然後利用子進程的結果繼續執行,這樣就圓滿地解決了我們提出的進程同步問題。


發佈了103 篇原創文章 · 獲贊 12 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章