Linuxのwait関数の解析

  

プロセスがwaitを呼び出すと、すぐに自分自身をブロックし、現在のプロセスのサブプロセスが終了したかどうかを自動的に分析します。この子プロセスの情報は、完全に破棄された後に収集されて返されますが、見つからない場合は、表示されるまで待機します。

wait(割り込みまたは子プロセスの終了を待つ)関連関数waitpid、フォークヘッダファイル#include< sys /types.h>#include< sys /wait.h>定義関数pid_t wait(int * status)この関数は、wait()がシグナルが到着するか子プロセスが終了するまで現在のプロセスの実行を一時的に停止すると言っています。 wait()が呼び出されたときに子プロセスが終了した場合、wait()は直ちに子プロセスの終了状態値を返します。子プロセスの終了状態値はパラメータstatusによって返され、子プロセスのプロセスIDはできるだけ早く返されます。終了状態の値を気にしない場合は、パラメータstatusをNULLに設定できます。子プロセスの終了状態の値については、waitpid()を参照してください。戻り値は、実行が成功した場合は子プロセスID(PID)を返し、エラーが発生した場合は-1を返します。失敗の理由はerrnoにあります。

例1 #include< stdlib.h> #include< unistd.h> #include< sys /types.h> #include< sys /wait.h> int main(){pid_t pid; int status 、i; if(fork()= = 0){printf('これは子プロセスです。.pid =%d \\ n'、getpid()); exit(5);} else {sleep(1); printf ('これは親プロセスです。子を待機しています... \\ n'; pid = wait(& status); i = WEXITSTATUS(ステータス); printf(' child> s pid =%d .exit status = %d \\ n'、pid、i);}}

実行これは子プロセスです。pid= 1501これは親プロセスです。子を待機しています... child’ pid = 1501、終了ステータス= 5


例2

#include< iostream>#include< unistd.h>#include< sys /wait.h>を使用して名前空間std; int main(void) ){pid_t pid; pid = fork(); if(pid< 0)exit(0); else if(pid == 0){//子プロセスが20秒間スリープした場合cout<< children> <<< getpid()< endl; sleep(20);} else {cout<<<<>;親プロセスです!<< endl; //親プロセスがここで待ってくださいpid_t pr = wait(N ULL); cout<< pr<< endl;}戻り値0;}
waitpid(割り込みまたは子プロセスの終了を待つ)関連関数wait、forkヘッダーファイル#include< sys /types.h> #include< sys /wait.h>関数pid_t waitpidの定義(pid_t pid、int * status、int options);関数の説明waitpid()は、シグナルが到着するか子プロセスが終了するまで現在のプロセスの実行を一時的に停止します。 waitpid()が呼び出されたときに子プロセスが終了した場合、waitpid()は直ちに子プロセスの終了状態値を返します。子プロセスの終了状態値はパラメータstatusによって返され、子プロセスのプロセスIDはできるだけ早く返されます。終了状態の値を気にしない場合は、パラメータstatusをNULLに設定できます。

パラメータpidは待機するサブプロセスIDですその他の値は次の意味を持ちます:pid< -1プロセスグループIDがpidの絶対値になるのを待っている子プロセス。 Pid = -1 wait()と同じ、任意の子プロセスを待ちます。 Pid = 0プロセスグループIDが現在のプロセスと同じになるのを待機している子プロセス。 Pid> 0は、子プロセスIDがpidであるすべての子プロセスを待ちます。

パラメータオプションは、0または以下のORの組み合わせにすることができます。WNOHANG終了した子プロセスがない場合、それらはただちに戻り、待機しません。 WUNTRACED子プロセスが中断された実行に入った場合にただちに戻りますが、終了状態は無視されます。

子プロセスの終了状態は、終了条件を決定するためのいくつかのマクロがあります:WIFEXITED(status)は、子プロセスが正常に終了した場合、ゼロ以外の値になります。 WEXITSTATUS(status)は、子プロセスexit()によって返された終了コードを取得します。一般に、WIFEXITEDを使用して正常に終了したかどうかを判断するために使用されます。 WIFSIGNALED(status)シグナルによってサブプロセスが終了した場合、マクロの値はtrueですWTERMSIG(status)シグナルによってサブプロセスによって中断されたシグナルコードは、通常、このマクロの使用を決定するためにWIFSIGNALEDによって使用されます。 WIFSTOPPED(status)このマクロ値は、子プロセスが中断された実行中の場合に真になります。これは通常、WUNTRACEDを使用している場合にのみ当てはまります。 WSTOPSIG(status)子プロセスを一時停止させるシグナルコードを取得します、通常、このマクロを使用する前にWIFSTOPPEDによって判断されます。

戻り値成功した場合は子プロセスID(PID)、エラーが発生した場合は-1を返します。失敗の理由はerrnoにあります。

例はwait()を参照しています。

Copyright © Windowsの知識 All Rights Reserved