第八章 程序控制 waitpid函式

2021-06-22 19:53:32 字數 1688 閱讀 7260

waitpid(等待子程序中斷或結束)

表頭檔案

#include

#include

定義函式  pid_t waitpid(pid_t pid,int * status,int options);

函式說明:

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 來判斷後才使用此巨集。

如果執行成功則返回子程序識別碼(pid) ,如果有錯誤發生則返回返回值-1。失敗原因存於 errno 中。

#include "apue.h"

#include int main(void)

else if(pid==0)

else if(pid>0)

else if(pid==0)

}//parent

if(waitpid(pid,null,0)!=pid)

else

exit(0);

}

jiang@ay140524110335068908z:~/new_apue$ gcc waitpid.c

jiang@ay140524110335068908z:~/new_apue$ ./a.out

first child exit.pid is 19519

waitpid:pid=19519

jiang@ay140524110335068908z:~/new_apue$

second child ,parent pid=1

jiang@ay140524110335068908z:~/new_apue$

第八章 程序控制

1 fork是核心建立新程序的唯一方法 除了交換程序,init和頁精靈程序 2 子程序獲得父程序的資料空間,堆,棧。子程序的這些空間是父程序的拷貝,並不共享。子程序也會複製父程序的io快取 程式8.1的例子 但是很多實現並不做父程序資料段和堆的完全拷貝,有的使用了 寫時複製 的技術。3 從下面的例子...

第八章 程序控制

1.程序標示符pid id為1 的通常是 init 程序。在自舉過程中被核心呼叫。該程序的程式檔案時 sbin init。此程序負責在自舉核心後啟動乙個unix系統。讀與系統相關的初始化檔案 etc rc 或 etc inittab 以及 etc init.d中的檔案 並引導系統到乙個狀態 如多使用...

第八章 程序排程和時間

總體來講,對於作業系統而言,處理機在任意時刻只能執行乙個程序。linux系統的排程基於分時 time sharing 技術 多個程序以 時間多路復用 方式執行,cpu的時間被分成 片 slice 每個可執行程序可以分配一片。在linux中,與程序相關的引數用資料結構task struct來描述。在有...