在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
參數有以下幾種取值:
pid > 0
:等待進程ID為pid
的子進程;pid = -1
:等待任意一個子進程;pid = 0
:等待和調用waitpid
函數的父進程在同一個進程組的任意子進程;pid < -1
:等待進程組ID為-pid
的任意子進程。status
參數和wait
函數一樣,用來保存子進程的終止狀態。
options
參數用來指定額外的選項,比如可以使用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;
}
輸出結果和前面的例子是一樣的。