Linux wait和waitpid和kill

來源:互聯網
上載者:User
1. Linux wait

1) 功能:等待子進程中斷或結束
2) 標頭檔
     #include<sys/types.h>
     #include<sys/wait.h>
3)  函數定義: pid_t wait (int * status);
4) 函數說明
    wait()會暫時停止目前進程的執行,直到有訊號來到或子進程結束。如果在調用 wait()時子進程已經結束,則 wait()會立即返回子進程結束狀態值。子進程的結束狀態值會由參數 status 返回,而子進程的進程識別碼也會一快返回。如果不在意結束狀態值,則 參數 status 可以設成 NULL。 子進程的結束狀態值請參考 waitpid( ),如果執行成功則返回子進程識別碼(PID) ,如果有錯誤發生則返回
5)傳回值
     -1。失敗原因存於 errno 中。

2. Linux waitpid

1) 功能:等待子進程中斷或結束
2) 標頭檔
      #include<sys/types.h>
      #include<sys/wait.h>
3) 函數定義:  pid_t waitpid(pid_t pid,int * status,int options);
4) 函數說明
    waitpid()會暫時停止目前進程的執行,直到有訊號來到或子進程結束。如果在調用 wait()時子進程已經結束,則wait()會立即返回子進程結束狀態值。子進程的結束狀態值會由參數 status 返回, 而子進程的進程識別碼也會一快返回。如果不在意結束狀態值,則參數 status 可以設成 NULL。參數 pid 為欲等待的子進程識別碼,其他數值意義如下:
    pid<-1 等待進程組識別碼為 pid 絕對值的任何子進程。
    pid=-1 等待任何子進程,相當於 wait()。            
    pid=0     等待進程組識別碼與目前進程相同的任何子進程。       
    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 來判斷後才使用此宏。
5) 傳回值

    如果執行成功則返回子進程PID,如果有錯誤發生則返回-1。失敗原因存於 errno 中。

3. wait與waitpid的區別

   waitpid提供了wait所沒有的三個特性:
   1) waitpid使我們可以等待指定的進程
   2) waitpid提供了一個無阻塞的wait
   3) waitpid支援工作控制

 

4. SIGCHLD

      核心對子進程終止(SIGCHLD)訊號的處理方法與其他訊號有所區別。當進程檢查出收到了一個子進程終止的訊號時,預設情況下,該進程 就象沒有收到該訊號似的,如果父進程執行了系統調用wait,進程將從系統調用wait中醒來並返回wait調用,執行一系列wait調用的後續操作(找
出僵死的子進程,釋放子進程的進程表項),然後從wait中返回。SIGCHLD訊號的作用是喚醒一個睡眠在可被中斷優先順序上的進程。如果該進程捕捉了這個 訊號,就象普通訊號處理一樣轉到處理常式。如果進程忽略該訊號,那麼系統調用wait的動作就有所不同,因為SIGCHLD的作用僅僅是喚醒一個睡眠在可被
中斷優先順序上的進程,那麼執行wait調用的父進程被喚醒繼續執行wait調用的後續操作,然後等待其他的子進程。 

      如果一個進程調用signal系統調用,並設定了SIGCHLD的處理方法,並且該進程有子進程處於僵死狀態,則核心將向該進程發一個SIGCHLD訊號。

 

5. Linux kill

1) 功能:用於向任何進程組或進程發送訊號。

2) 標頭檔

   #include <sys/types.h>
   #include <signal.h>

3) 函數定義:int kill(pid_t pid, int sig);

4) 函數說明

    pid:可能選擇有以下四種

            1) pid大於零時,pid是訊號欲送往的進程的標識。
            2) pid等於零時,訊號將送往所有與調用kill()的那個進程屬同一個使用組的進程。
            3) pid等於-1時,訊號將送往所有調用進程有權給其發送訊號的進程,除了進程1(init)。
            4) pid小於-1時,訊號將送往以-pid為組標識的進程。

    sig:準備發送的訊號代碼,假如其值為零則沒有任何訊號送出,但是系統會執行錯誤檢查,通常會利用sig值為零來檢驗某個進程是否仍在執行。

 

5) 傳回值 

    成功執行時,返回0。

    失敗返回-1,errno被設為以下的某個值

             EINVAL:指定的訊號碼無效(參數 sig 不合法)

             EPERM:許可權不夠無法傳送訊號給指定進程

             ESRCH:參數 pid 所指定的進程或進程組不存在

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.