C 語言中的 wait 函式
Jinku Hu
2023年10月12日
本文將演示關於如何使用 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
函式來等待特定子程序的狀態變化
waitpid
是 wait
函式的一個略微增強的版本,它提供了等待特定子程序和修改返回觸發行為的功能。waitpid
除了子程序被終止的情況外,還可以返回子程序是否已經停止或繼續。
在下面的例子中,我們從子程序呼叫 pause
函式,子程序進入睡眠狀態,直到收到訊號。另一方面,父程序呼叫 waitpid
函式,暫停執行,直到子程序返回。並利用巨集 WIFEXITED
和 WIFSIGNALED
分別檢查子程序是正常終止還是被訊號終止,然後將相應的狀態資訊列印到控制檯。
#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