コンカレント・サーバの概要---マルチプロセスのコンカレント---2
3032 ワード
プロセス終了には、親プロセスが子プロセスより先に終了し、子プロセスが親プロセスより先に終了する2つの可能性があります.
親プロセスがサブプロセスの前に終了すると、すべてのサブプロセスの親プロセスがinitプロセスに変更され、initプロセスによって養子縁組されます.プロセスが終了すると、
システムは、すべてのアクティブなプロセスを個別にチェックし、これらのプロセスが終了するときに終了するプロセスのサブプロセスであるかどうかを判断します.もしそうであれば、そのプロセスの親プロセスIDは
1(initのID)は、各プロセスに親プロセスがあることを保証します.
サブプロセスが親プロセスの前に終了すると、システムカーネルは各終了サブプロセスにいくつかの情報を保存し、親プロセスはwait()または
waitpid()関数は、サブプロセスの終了情報を取得します.サブプロセスを終了するために保存される情報には、プロセスID、プロセスの終了ステータス、およびプロセスが使用する
すべてのストレージ領域、開いているすべてのファイルを閉じます.終了したが、親プロセスがまだ処理されていないプロセスをゾンビプロセスと呼びます.
サブプロセスが正常または異常に終了すると、システムカーネルは親プロセスにSIGCHLD信号を送信する.デフォルトでは、親プロセスは信号を無視するか、
信号が発生したときに呼び出される関数です.
親プロセスは、wait()またはwaitpid()関数を呼び出すことで、サブプロセスの終了情報を取得できます.
wait関数は次のとおりです.
#include
pid_t wait(int *statloc);
パラメータstatlocは、サブプロセスの終了状態(整数)を返します.関数を呼び出すと、サブプロセスが終了した場合、関数はすぐに戻ります.
サブプロセスのすべてのリソースを解放し、戻り値はサブプロセスを終了するID番号である.現在終了しているサブプロセスがなく、実行中のサブプロセスがある場合、waitは
すべてのサブプロセスが終了するまでブロックされます.現在終了しているサブプロセスも実行中のサブプロセスもない場合は、エラー-1が返されます.
wait関数の使い方は次のとおりです.
pid_t pid;
int chdestaus;
if ((pid=fork()) > 0){
........//parent process
wait(&chdestaus);
}else if (0 == pid){
..........//child process
exit(0);
}else{
printf("fork() error
");
exit(0);
}
関数waitpidは、どのプロセスの終了を待つか、ブロック操作方式を採用するかなど、より多くの制御を与える.waitpid関数は次のとおりです.
#include
pid_t waitpid(pid_t pid, int *statloc, int option);
waitpid()は、信号が来るかサブプロセスが終了するまで、現在のプロセスの実行を一時的に停止します.パラメータpidは、待機するサブプロセスのPID、statloc、waitの
同様に、サブプロセスの終了ステータスを返します.
pid値の意味は次のとおりです.
pid>0プロセスIDがpidに等しいサブプロセスの終了を待つ
pid=0そのグループIDが呼び出しプロセスのグループIDに等しいのを待つ任意のサブプロセス
pid<-1は、そのグループIDがpid絶対値に等しい任意のサブプロセスを待つ
pid=-1任意のサブプロセスを待つ
パラメータoptionは、0または次のORの組み合わせとすることができる.
WNOHANG終了したサブプロセスがなければすぐに戻り、待たない.
WUNTRACEDは,サブプロセスが一時停止実行に入った場合はすぐに戻るが,終了状態は無視する.
サブプロセスの終了状態が戻ってstatlocに保存され、以下にいくつかのマクロが終了状況を判別することができる.
WIFEXITED(statloc)サブプロセスが正常に終了すると0以外の値になります.
WEXITSTATUS(statloc)は、サブプロセスexit()から返される終了コードを取得し、通常はWIFEXITEDで正常に終了しているかどうかを判断してこのマクロを使用する.
WIFSIGNALED(statloc)サブプロセスが信号のために終了した場合、このマクロ値は真である
WIFRMSIG(statloc)は、サブプロセス殷信号を取得して終了する信号コードであり、WIFSIGNALEDで判断してからこのマクロを使用するのが一般的である.
WIFSTOPED(statloc)サブプロセスが実行を一時停止している場合、このマクロ値は真であり、一般的にはWUNTRACEDのみが使用される場合に発生します.
WSTOPSIG(statloc)は、サブプロセスの一時停止を引き起こす信号コードを取得し、一般的にWIFSTOPEDで判断してからこのマクロを使用する.
実行に成功するとサブプロセス識別コード(PID)が返され、エラーが発生すると戻り値は-1となり、エラーの原因はerrorに格納されます.
exit()関数は、プロセスを終了し、ステータスを返します.
#include
void exit(int status);
この関数は呼び出しプロセスを終了し、すべてのサブプロセスが開いている記述子を閉じ、親プロセスにSIGCHLD信号を送信し、ステータスを返します.その後、親プロセスはwaitまたはwaitpid関数を呼び出してサブプロセスを終了するステータスを得ることができます.