C 語言中的 wait 函式

Jinku Hu 2023年1月30日 2021年2月7日
  1. 在 C 語言中使用 wait 函式來等待子程序的狀態變化
  2. 在 C 語言中使用 waitpid 函式來等待特定子程序的狀態變化
C 語言中的 wait 函式

本文將演示關於如何使用 C 語言中的 wait 函式的多種方法。

在 C 語言中使用 wait 函式來等待子程序的狀態變化

wait 函式是符合 POSIX 標準的系統呼叫的封裝器,定義在 <sys/wait.h> 標頭檔案中。該函式用於等待子程序的程式狀態變化,並檢索相應的資訊。wait 通常在建立新子程序的 fork 系統呼叫之後呼叫。wait 呼叫會暫停呼叫程式,直到它的一個子程序終止。

使用者應該將程式碼結構化,使呼叫程序和子程序有兩條不同的路徑。通常用 if...else 語句來實現,該語句評估 fork 函式呼叫的返回值。注意 fork 在父程序中返回子程序 ID,一個正整數,在子程序中返回 0。如果呼叫失敗,fork 將返回-1。

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


int main() {
    pid_t c_pid = fork();

    if (c_pid == -1) {
        perror("fork");
        exit(EXIT_FAILURE);
    }

    if (c_pid == 0) {
        printf("printed from child process %d", getpid());
        exit(EXIT_SUCCESS);
    } else {
        printf("printed from parent process %d\n", getpid());
        wait(NULL);
    }

    exit(EXIT_SUCCESS);
}

在 C 語言中使用 waitpid 函式來等待特定子程序的狀態變化

waitpidwait 函式的一個略微增強的版本,它提供了等待特定子程序和修改返回觸發行為的功能。waitpid 除了子程序被終止的情況外,還可以返回子程序是否已經停止或繼續。

在下面的例子中,我們從子程序呼叫 pause 函式,子程序進入睡眠狀態,直到收到訊號。另一方面,父程序呼叫 waitpid 函式,暫停執行,直到子程序返回。並利用巨集 WIFEXITEDWIFSIGNALED 分別檢查子程序是正常終止還是被訊號終止,然後將相應的狀態資訊列印到控制檯。

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


int main() {
    pid_t child_pid, wtr;
    int wstatus;

    child_pid = fork();
    if (child_pid == -1) {
        perror("fork");
        exit(EXIT_FAILURE);
    }

    if (child_pid == 0) {
        printf("Child PID is %d\n", getpid());
        pause();
        _exit(EXIT_FAILURE);
    } else {
        wtr = waitpid(child_pid, &wstatus, WUNTRACED | WCONTINUED);
        if (wtr == -1) {
            perror("waitpid");
            exit(EXIT_FAILURE);
        }

        if (WIFEXITED(wstatus)) {
            printf("exited, status=%d\n", WEXITSTATUS(wstatus));
        } else if (WIFSIGNALED(wstatus)) {
            printf("killed by signal %d\n", WTERMSIG(wstatus));
        }
    }
    exit(EXIT_SUCCESS);
}
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相關文章 - C Process