Linux の wait() 関数と waitpid() 関数の使い方は?

Linux では、子プロセスの終了を待機するために wait 関数と waitpid 関数が使われます。

wait()関数のプロトタイプは次のとおりです。

pid_t wait(int *status);

statusは整数変数へのポインタで، 子プロセスの終了ステータスを格納する。この関数は子プロセスが終了するまで呼び出しプロセスをブロックする。子プロセスがすでに終了していれば,その終了ステータスは即座に返される。呼び出しプロセスに子プロセスがいないか,子プロセスがすでに別のプロセスによって待たれている場合,wait() 関数はエラーを返す。

waitpid() 関数のプロトタイプは次のとおりです。

pid_t waitpid(pid_t pid, int *status, int options);

pid は待機中の子プロセスのプロセス ID です。-1 を使用することで任意の子プロセスの待機ができます。status パラメータには子プロセスの終了ステータスが格納されます。options パラメータでは、WNOHANG のようにブロックしない待機を指定するなどのオプションを指定できます。

waitpid()関数は、指定された子プロセスが終了するまで呼び出し側プロセスをブロックします。指定された子プロセスがすでに終了している場合、その終了ステータスはすぐに返されます。呼び出し側プロセスで指定された子プロセスがいない場合、または指定された子プロセスが他のプロセスで待機されている場合、waitpid()関数はすぐにエラーを返して-1になります。

wait()関数の例を以下に示します。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main() {
    pid_t pid;
    int status;

    pid = fork();

    if (pid == 0) {
        // 子进程
        printf("子进程开始运行\n");
        sleep(3);
        printf("子进程结束\n");
        exit(0);
    } else if (pid > 0) {
        // 父进程
        printf("父进程等待子进程终止\n");
        wait(&status);
        printf("子进程终止\n");
    } else {
        // fork失败
        printf("fork失败\n");
        return 1;
    }

    return 0;
}

例:以下に waitpid() 関数を使用した例を示します。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main() {
    pid_t pid;
    int status;

    pid = fork();

    if (pid == 0) {
        // 子进程
        printf("子进程开始运行\n");
        sleep(3);
        printf("子进程结束\n");
        exit(0);
    } else if (pid > 0) {
        // 父进程
        printf("父进程等待子进程终止\n");
        waitpid(pid, &status, 0);
        printf("子进程终止\n");
    } else {
        // fork失败
        printf("fork失败\n");
        return 1;
    }

    return 0;
}

上記の例では、親プロセスは子プロセスの終了を待ち、その後、それに応じてメッセージを表示します。

bannerAds