Linuxでは、Wait関数とwaitpid関数はどのように使用されますか?
Linux環境において、wait関数とwaitpid関数はどちらも子プロセスの終了を待ち、子プロセスの終了状態を取得するために使用されます。
wait 関数のプロトタイプは次のとおりです。
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);
wait()関数は任意の子プロセスの終了を待ち、子プロセスの終了ステータスを、statusで指定された整数変数に格納します。子プロセスの終了ステータスに興味がない場合は、statusをNULLに設定できます。wait()関数は、終了した子プロセスのプロセスIDを返します。
サンプルコードを以下に示します。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main() {
pid_t pid = fork();
if (pid == -1) {
perror("fork");
exit(1);
} else if (pid == 0) {
// 子进程执行的代码
printf("Child process\n");
sleep(3);
exit(0);
} else {
// 父进程执行的代码
printf("Parent process\n");
int status;
pid_t child_pid = wait(&status);
if (WIFEXITED(status)) {
printf("Child process %d exited normally with status %d\n", child_pid, WEXITSTATUS(status));
} else {
printf("Child process %d exited abnormally\n", child_pid);
}
}
return 0;
}
結果を表示する
Parent process
Child process
Child process 1234 exited normally with status 0
waitpid関数の関数プロトタイプは次の通りです。
#include <sys/types.h>
#include <sys/wait.h>
pid_t waitpid(pid_t pid, int *status, int options);
waitpid関数は、待機する子プロセスのIDを指定できます。pidパラメータは、次の値をとることができます。
- pid > 0: 子プロセスIDがpidの子プロセスを待つ
- pid=-1:すべてのサブプロセスを待機。
- pid=0: waitpid 関数を呼び出す親プロセスと同じプロセスグループ内のどのプロセスでも待つ
- pid < -1:pidが-pidである子プロセス群のいずれかの子プロセスを待つ。
ステータス引数は wait 関数と同様に、子プロセスの終了ステータスを格納するために使用されます。
オプションパラメータを用いて、WNOHANGオプションなど追加のオプションを指定して、子プロセスの終了を非ブロックで待つことができます。
次のコードを見てください。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main() {
pid_t pid = fork();
if (pid == -1) {
perror("fork");
exit(1);
} else if (pid == 0) {
// 子进程执行的代码
printf("Child process\n");
sleep(3);
exit(0);
} else {
// 父进程执行的代码
printf("Parent process\n");
int status;
pid_t child_pid = waitpid(pid, &status, 0);
if (WIFEXITED(status)) {
printf("Child process %d exited normally with status %d\n", child_pid, WEXITSTATUS(status));
} else {
printf("Child process %d exited abnormally\n", child_pid);
}
}
return 0;
}
出力結果は前の例と同じです。