waitpid()函數(shù)是用來等待子進程結(jié)束的函數(shù),其原型如下:
#include <sys/types.h>
#include <sys/wait.h>
pid_t waitpid(pid_t pid, int *status, int options);
參數(shù)說明:
pid
:指定要等待的子進程ID,可以是具體的進程ID,也可以是以下值之一:
-1
:等待任意子進程結(jié)束;
0
:等待和調(diào)用進程屬于同一個進程組的任意子進程結(jié)束;
大于0的值:等待指定進程ID的子進程結(jié)束。
status
:用于存儲子進程的退出狀態(tài)信息,如果不關(guān)心子進程的退出狀態(tài),可以將該參數(shù)設(shè)為NULL
。
options
:設(shè)置等待的選項,常用的選項包括:
WUNTRACED
:如果子進程進入暫停狀態(tài),則立即返回;
WCONTINUED
:如果子進程由暫停狀態(tài)變?yōu)槔^續(xù)運行狀態(tài),則立即返回;
WNOHANG
:如果沒有子進程退出或者進入暫停狀態(tài),則立即返回0,而不阻塞等待。
返回值:
如果調(diào)用成功,返回子進程的進程ID;
如果調(diào)用失敗,返回-1。
下面是一個示例代碼,演示了如何使用waitpid()函數(shù)等待子進程結(jié)束:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main() {
pid_t pid = fork(); // 創(chuàng)建子進程
if (pid < 0) {
perror("fork");
exit(1);
} else if (pid == 0) {
// 子進程執(zhí)行的代碼
printf("Child process: My PID is %d\n", getpid());
sleep(2); // 子進程休眠2秒
exit(0); // 子進程退出
} else {
// 父進程執(zhí)行的代碼
printf("Parent process: My PID is %d\n", getpid());
int status;
pid_t child_pid = waitpid(pid, &status, 0); // 等待子進程結(jié)束
if (child_pid < 0) {
perror("waitpid");
exit(1);
}
if (WIFEXITED(status)) {
printf("Child process %d exited with status %d\n", child_pid, WEXITSTATUS(status));
}
}
return 0;
}
運行以上代碼,將輸出父進程的PID、子進程的PID以及子進程的退出狀態(tài)。