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パラメータは、次の値をとることができます。

  1. pid > 0: 子プロセスIDがpidの子プロセスを待つ
  2. pid=-1:すべてのサブプロセスを待機。
  3. pid=0: waitpid 関数を呼び出す親プロセスと同じプロセスグループ内のどのプロセスでも待つ
  4. 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;
}

出力結果は前の例と同じです。

bannerAds