C 語言中的 wait 函式

Jinku Hu 2023年10月12日
  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 <stdio.h>
#include <stdlib.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 <stdio.h>
#include <stdlib.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);
}
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook

相關文章 - C Process