1. 程式人生 > >wait()、waitpid()及waitid()介紹

wait()、waitpid()及waitid()介紹

這三個函式的原型如下:

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

       pid_t wait(int *status);

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

       int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);

這三個系統呼叫是用來讓呼叫程序等待其子程序狀態更改,並獲取這種狀態改變資訊的。子程序的狀態更改是指1>子程序終止;2>子程序被一個訊號暫停;3>子程序收到一個訊號重新運行了。對於第一種情況,執行這三個系統呼叫可以使得系統收回結束子程序佔用的資源,如果子程序終止了,但我們沒有執行這三個中的任何一個,則子程序將變為“殭屍程序”,殭屍程序也會佔用一部分系統資源,所以我們應該儘可能的避免系統中存在過多的殭屍程序。

pid_t wait(int *status):該呼叫會阻塞呼叫程序,直到其某個子程序終止(注意是終止)或者呼叫程序自己被一個訊號處理打斷了。對於第二種情況我們應該注意,如果這不是我們期望的結果,我們應該想辦法重啟該系統呼叫。可用如下方法重啟:

#include <errno.h>
#include <sys/types.h>
pid_t r_wait(int *stat_loc)
{
       pid_t child_pid;

       while (((child_pid =wait(stat_loc) )== -1) && (errno == EINTR));
        return child_pid;
}

引數stat_loc用來獲取子程序的狀態更改資訊,後面會介紹如何解析這種狀態;如果我們不關注其具體狀態更改是什麼,呼叫是可傳遞NULL。

pid_t waitpid(pid_t pid, int *status, int options):這個功能最豐富,也是最好用的一個。預設情況下,呼叫其會阻塞呼叫程序直到指定的子程序狀態發生改變,這種行為可以通過引數options改變。成功則返回子程序id,如果指定了WNOHANG,並且此時pid指定的子程序有多個,但是它們的狀態還沒有發生改變,這時返回0,出錯返回-1。其引數描述如下

pid的可能值為:

  • <-1:意味著等待的子程序為pid的絕對值標識的程序組中的任意一個
  • =-1:意味著等待其任意一個子程序
  • =0:意味著等待和呼叫程序在同一個程序組中的任意子程序
  • >0:意味著等待的子程序的程序id為指定值

options的值可以為如下三個值的或操作組合:

  • WNOHANG:設定該引數呼叫程序不會被阻塞,不論子程序狀態有無改變,立即返回
  • WUNTRACED:設定該引數使得當子程序暫停時也會返回。對於這個引數,還有一些描述我沒有弄明白,若有弄明白的不妨指點一下,不甚感謝。
  • WCONTINUED:設定該引數後,當等待的子程序收到訊號SIGCONT,由暫停狀態變為執行狀態後也會返回。

如果呼叫時,status不是NULL,則子程序的狀態將會被儲存到這個整形引數中,我們可以用如下巨集檢查這個值,這些巨集的引數是整形值本身,不是其指標:

  • WIFEXITED(status):如果子程序正常終止返回true,當子程序有return、exit()或_exit()返回時為正常終止。
  • WEXITSTATUS(status):返回子程序的終止狀態(由return、exit()或_exit()返回的),是一個8位值,這個巨集應該在確定WIFEXITED返回true時再使用
  • WIFSIGNALED(status):如果子程序是被一訊號終止的則返回true
  • WTERMSIG(status):返回造成子程序終止的訊號的數目,這個巨集應該在確定WIFSIGNALED返回true時再使用
  • WCOREDUMP(status):如果子程序產生一個core dump時返回true,這個巨集應該在確定WIFSIGNALED返回true時再使用,並且應該用#ifdef WCOREDUMP ...#endif抱起來,這個巨集在有些版本上是不適用的。
  • WIFSTOPPED(status):當子程序被暫停時返回true,這隻可能出現在使用WUNTRACED呼叫waitpid或者子程序確實是正在被跟蹤(除錯時).
  • WSTOPSIG(status):返回造成子程序暫停的訊號的數目,這個巨集應該在WIFSTOPED返回true時使用
  • WSTOPSIG(status):在linux 2.6.10版本後可以使用,當子程序收到訊號SIGCONT後由暫停狀態回到執行狀態時返回true

int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options):這個呼叫適用與linxu 2.6.9之後,它對等待的是哪一個子程序提供了更加精確的控制。執行成功或者指定了WNOHANG,但是id所指的子程序狀態沒有發生改變時返回0;出錯返回-1。

idtype和id配合使用來指定等待的是哪一個子程序,idtype的值可以有:

  • = P_PID:等待的子程序的pid必須和id匹配
  • = P_GID:等待的子程序的組id需和id匹配
  • = P_ALL:等待所有子程序,此時id被忽略

options的值可以為如下幾個的或操作組合:

  • WEXITED:等待那些已經終止的子程序
  • WSTOPPED:等待那些被訊號暫停的子程序
  • WCONTINUED:等待那些由SIGCONT重新啟動的子程序
  • WNOHANG:同wiatpid中的
  • WNOWAIT:從處於”可等待狀態“的子程序返回,但是後面的wait還可以獲取子程序的狀態

如果infop不為NULL,則檔waitid成功返回時,這個結構將會被填寫,我們可以從該結構中獲取我們感興趣的資訊,其中有:

  • si_pid: 子程序的程序id
  • si_uid:子程序的真實使用者id
  • si_signo:總是設定為SIGCHID
  • si_status:要麼是子程序的返回狀態,要麼是造成子程序狀態改變的訊號,si_code說明如何來解釋這個域
  • si_code:可以設定為CLD_EXITED、CLD_KILLED、CLD_DUMPED、CLD_STOPPED、 CLD_TRAPPED 、CLD_CONTINUED,哪種情況為哪個值一看名字就能明白

當出錯返回時,這三個呼叫都應該檢查如下errno:ECHILD、EINTR、EINVAL。

以上內容來自linux聯機幫助文件。。。。

相關推薦

wait()waitpid()waitid()介紹

這三個函式的原型如下:        #include <sys/types.h>        #include <sys/wait.h>        pid_t wait(int *status);        pid_t waitpi

linux 進程等待 wait waitpid

popu split var this asc pro 絕對值 scrip ddc waitpid() 與 wait() 功能相似,都是用戶主進程等待子進程結束或中斷. 可用於進程之間的同步 wait 函數原型 pid_t wait(int *sta

exit()與_exit()函式waitwaitpid孤兒殭屍

  注:exit()就是退出,傳入的引數是程式退出時的狀態碼,0表示正常退出,其他表示非正常退出,一般都用-1或者1,標準C裡有EXIT_SUCCESS和EXIT_FAILURE兩個巨集,用exit(EXIT_SUCCESS);可讀性比較好一點。 作為系統呼叫而言,_exit

小程式開發之元件事件處理函式routesetData介紹

元件事件處理函式 Page 中還可以定義元件事件處理函式。在渲染層的元件中加入事件繫結,當事件被觸發時,就會執行 Page 中定義的事件處理函式。 .wxml <view bindtap="viewTap">click me</view> .js

Mockito入門例項完整介紹

回到官網:http://mockito.org/,開啟documentation可以看到原文。 強烈建議不熟悉Mockito的同學先看看我寫的Mockito(一)入門篇和(二)例項篇之後再來看這篇文章。 因為只有看了前兩篇文章才明白mockito的本質以及該如何使用它。 下面是按原文 翻譯+註釋 的對

Scala之ListBufferArrayBufferQueueStack介紹

1、程式碼 package com.yy.base import scala.collection.immutable.Queue object BufferQueueAndStackTest extends App { //ListBuffer import

FFmpeg下載安裝內容介紹

FFmpeg是什麼呢?A complete, cross-platform solution to record, convert and stream audio and video.一個完全的,跨平臺的記錄,轉換音視訊流的解決方案。官網地址:http://ffmpeg.o

微信小程式入門從這裡出發(登入註冊開發工具檔案結構介紹

![](http://image.ideal-20.cn/weixin-mini/19-01-01-000.png) # (一) 準備工作 ## (1) 登入註冊 - 註冊賬號:這就不談了,只需要注意使用一個全新的郵箱,別之前註冊過公眾號小程式等就可以了 - `https://mp.weixin.q

Randoop介紹安裝環境變量配置

you 套件 文件路徑 令行 sts dt.jar 開發 通知 一個 大體來說,開發人員開發源程序,測試人員找bug,中間人產品經理。 黑盒測試:(不看代碼) 白盒測試:     1、基於覆蓋:語句、分支(if、for、真假)、方法     結構:順序、分支(T or F,

微信小程序 WXMLWXSS 和JS介紹詳解

名單 獲取 hang href 直接 last 1.2 data sub 前幾天折騰了下。然後列出一些實驗結果,供大家參考。 百牛信息技術bainiu.ltd整理發布於博客園 0. 使用開發工具模擬的和真機差異還是比較大的。也建議大家還是真機調試比較靠譜。 1. WXML(

python語法基礎ifwhilefor等語句介紹

python代碼註釋:單行註釋以#開頭,右邊當做註釋,一般註意下一行內容,方便維護記憶。多行註釋以一對三單引號或一對三雙引號 python2不管中文是代碼還是註釋都會報錯,而python就不會,解決辦法如下:#coding=utf-8或#-*- coding:utf-8 -*-(python推薦的) 雖然也是

ziptar工具的介紹用法

centos 7 zip tar 6.5 zip壓縮工具6.6 tar打包6.7 打包並壓縮6.5 zip壓縮工具直接壓縮 格式 zip 1.txt.zip 1.txt //可以看到zip需要先命名文件[root@centos7 tmp]# ls -lh 1.txt 查看文件大小 -rw-r

bash腳本之函數簡單介紹應用函數的簡單遞歸調用

bash腳本bash腳本編程--函數 在bash中,函數是由命令和語句結構構成的能夠實現特定功能的集合; 為什麽要在bash中引入函數? 在bash腳本編寫過程中有可能會出現重復且不做任何改變的代碼內容,如果這類內容全靠原始代碼書寫的話不易於排錯和優化;因此我們可以選擇將此類代碼封裝在函數中,在適當的場景中可

linux的php-fpm的pool慢執行日誌進程管理open_basedir介紹

effect 記得 errors 根據 rest time -a 分享 mit php-fpm的pool Nignx可以配置多個虛擬主機,php-fpm同樣也支持配置多個pool,每一個pool可以監聽一個端口,也可以監聽一個socket。 php-fpm配置說明:

Ansible的安裝配置常用模塊介紹

touch cbc tor ext num using remove face 附加 Ansible的安裝、配置及常用模塊介紹 ansible安裝方式 1、 ansible安裝常用兩種方式,yum安裝和pip程序安裝 這裏提供二種安裝方式,任選一種即可: 1、使用yum

負載均衡集群介紹LVS介紹調度算法 LVS NAT模式搭建

分配 hashing fault cmp apach dir 流行 tina -s 一、 負載均衡集群介紹 實現負載均衡主流開源軟件LVS、keepalived、haproxy、nginx等 1)、其中LVS屬於4層(網絡OSI 7層模型),nginx屬於7層,haprox

TCP三次握手和四次揮手,TCP協議埠狀態說明:CLOSE-WAITTIME-WAIT LISTENINGSYN_SENTESTABLISHEDLAST-ACK ...

TCP三次握手和四次揮手狀態圖: 三次握手: 第一次 第一次握手:建立連線時,客戶端傳送SYN包(syn=j)到伺服器,並進入SYN_SENT狀態,等待伺服器確認;SYN:同步序列編號(Synchronize Sequence Numbers)。 第二次 第二次握手:伺服器收到syn包

介紹SVN和git,各自的區別優缺點適用範圍

SVN是Subversion的簡稱,是一個開放原始碼的版本控制系統,支援大多數常見的作業系統。作為一個開源的版本控制系統,Subversion管理著隨時間改變的資料。這些資料放置在一箇中央資料檔案庫(repository)中。這個檔案庫很像一個普通的檔案伺服器,不過它會記住每一次檔案的變動。

分散式微服務架構Spring Boot入門例項介紹

spring boot入門 -- 介紹和第一個例子 “越來越多的企業選擇使用spring boot 開發系統,spring boot牛在什麼地方?難不難學?心動不如行動,讓我們一起開始學習吧!” 使用Spring boot ,可以輕鬆的建立獨立執行的程式,非常容易構建獨立的服務元件,是實現

Mybatis三劍客(mybatis-generatormybatis-pluginmybatis-pagehelper)介紹配置破解

Mabatis三劍客分別是:mybatis-generator、mybatis-plugin、mybatis-pagehelper 一、mybatis-generator 根據我們的資料庫自動生成pojo、dao和xml檔案  pojo裡面放的是跟資料庫欄位一一對應的物件