父子程序有時需要簡單的程序間同步,如父程序等待子程序的結束。
linux提供了以下兩個等待函式:wait(),waitpid().
需要包含標頭檔案:
#include
#include
1) pid_t wait(int *status);
功能:等待任一子程序終止,如果子程序終止了,此函式會**子程序的資源。
呼叫wait函式的程序會被掛起(阻塞),直到它的乙個子程序退出或收到乙個不能被忽視的訊號時才被喚醒。
若呼叫程序沒有子程序或它的子程序已經結束,該函式立即返回。
引數:函式返回時,引數status中包含子程序退出時的狀態資訊。
子程序的退出資訊在乙個int中包含了多個字段,用巨集定義可以取出其中的每個字段。
返回值:如果執行成功則返回子程序的程序號。出錯返回-1,失敗原因存在errno中。
取出子程序的退出資訊:
>>wifexited(status)
如果子程序是正常終止的,取出的字段值非零。
>>wexitstatus(status)
返回子程序的退出狀態,退出狀態儲存在status變數的8~16位。
在用此巨集前應先用巨集wifexited判斷子程序是否正常退出,正常退出才可以使用此巨集。
fork3.c**展示:
#include #include #include #include int main()else if(pid == 0)
_exit(1);
}else
printf("this is father process.\n");
}return 0;
}
編譯和執行結果如下:
功能:等待指定子程序終止,如果子程序終止了,此函式會**子程序的資源。
返回值:如果執行成功則返回子程序id。出錯返回-1,失敗原因存於errno中。
---- 從本質上講,系統呼叫waitpid和wait的作用是完全相同的,但waitpid多出了兩個可由使用者控制的引數pid和options,從而為我們程式設計提供了另一種更靈活的方式。
pid:當引數pid取不同的值時,有不同的意義:
1> pid>0時,只等待程序id等於pid的子程序,不管其它已經有多少子程序執行結束退出了,只要指定的子程序還沒有結束,waitpid就會一直等下去。
2> pid=-1時,等待任何乙個子程序退出,沒有任何限制,此時waitpid和wait的作用一模一樣。
3> pid=0時,等待和該程序在同乙個程序組中的任何子程序,如果某個子程序已經加入了別的程序組,waitpid不會對它做任何理睬。
4> pid指定程序組中的任何子程序,這個程序組的id等於pid的絕對值。
options:目前在linux中只支援wnohang和wuntraced兩個選項,可以用」|「運算子把它們連線起來使用,如:
ret = waitpid(-1,null,wnohang|wuntraced);
wnohang,表示即使沒有子程序退出,它也會立即返回,不會像wait那樣永遠等下去。
wuntraced,與跟蹤除錯有關,極少用到。
waitpid的返回值比wait稍微複雜一些,一共有3種情況:
>> 正常返回的時候,waitpid返**集到的子程序的程序id;
>> 如果設定了選項wnohang,而呼叫中waitpid發現沒有已退出的子程序可收集,則返回0;
>> 呼叫中出錯,則返回-1,這時errno會被設定成相應的值以指示錯誤所在。例如:當pid所指示的子程序不存在,或此程序存在,但不是呼叫程序的子程序,waitpid就會出錯返回,這時errno被設定為echild。
等待程序結束wait
include include pid t wait int status status 子程序結束時返回的終止狀態 子程序是怎麼結束的 status是乙個傳出引數 如果父程序不關心子程序的狀態,向wait中傳入null 功能 等待子程序結束 阻塞等待 成功 返回子程序的pid,失敗 返回 1擴充套...
wait 函式父程序等待子程序退出
include include pid t wait int status pid t waitpid pid t pid,int status,int options include include pid t wait int status pid t waitpid pid t pid,int...
程序的等待(wait和waitpid)
1.程序的等待 wait函式或waitpid程序可能發生如下情況 1 如果所有的子程序孩子執行,則阻塞 block 2 如果乙個子程序已經終止,正等待父程序獲取其終止狀態,則取得孩子程序的終止狀態返回 3 如果她沒有任何子程序,則立即出錯返回 函式的原型 include pid t wait int...