日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Linux学习之系统编程篇:进程回收(wait / waitpid)

發布時間:2024/9/30 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux学习之系统编程篇:进程回收(wait / waitpid) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、wait

wait 函數 :阻塞函數,使進程一直處于等待狀態,直至進程死亡。
(1)頭文件:

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

(2)函數使用:

pid_t wait(int *status);

參數用于判斷子進程的死亡原因。
正常死亡:return 0 exit(1)
信號殺死:kill -9 pid
詳細如下代碼所示:

int status; // 傳出參數 pid_t wpid = wait(&status); if(WIFEXITED(status)) // WIFEXITED(status) 非 0,說明程序正常結束 {printf(“exit value : %d\n”, WEXITSTATUS(status)); // 結果是 return 或 exit 的值 } else if(WIFSIGNALED(status)) // WIFSIGNALED(status) 非 0,說明程序異常終止,信號殺死 {printf(“kill by Signal: %d\n”, WTERMSIG(status)); // 結果說明是被幾號信號殺死的 }

若不關心死亡原因可簡化使用方法:wait(NULL);
(3)返回值類型:pid_t
返回值 = -1 表示失敗,意味著沒有子進程,回收結束。
返回值 > 0 返回值是被回收子進程的 pid。
注意:wait 函數一次只能回收一個子進程,回收多個子進程需要循環(注意判斷條件)

while( ( wpid = wait(&status) ) != -1) { 判斷死亡原因 } // 關心死亡原因 while( ( wpid = wait(NULL) ) != -1) { } // 不關心死亡原因

二、waitpid

waitpid 函數可以設置非阻塞。
(1)函數使用:

pid_t waitpid(pid_t pid, int *status, int options);

(2)
參數 pid_t pid:
當pid=-1:回收任意一個子進程
當pid> 0:回收進程 ID 等于 pid 的子進程(定向回收)
參數 status: 用于判斷死亡原因,同 wait 函數
參數 options:設置為 0表示阻塞; 設置為 WNOHANG表示非阻塞。

(3)
返回值 > 0 :被回收子進程的 pid。
返回值 =-1 :回收結束。
返回值 = 0 :設置為 WNOHANG 會出現,且還有子進程正在運行,沒有退出 。
注意:waitpid 函數一次也只能回收一個子進程,回收多個子進程需要循環。代碼如下:

while( ( wpid = waitpid(-1,&status, WNOHANG) ) != -1) { if(wpid == 0) {continue; // 子進程還在運行,所以沒必要執行下面的代碼 } printf(“child died pid = %d\n”,wpid); if(WIFEXITED(status)) {printf(“exit value : %d\n”, WEXITSTATUS(status)); } else if(WIFSIGNALED(status)) {printf(“kill by Signal: %d\n”, WTERMSIG(status)); } }

總結

以上是生活随笔為你收集整理的Linux学习之系统编程篇:进程回收(wait / waitpid)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。