waitpid函數(shù)用于等待指定的子進(jìn)程終止,并獲取子進(jìn)程的狀態(tài)信息。
waitpid函數(shù)的原型如下:
#include <sys/types.h>
#include <sys/wait.h>
pid_t waitpid(pid_t pid, int *status, int options);
參數(shù)說明:
pid:指定要等待的子進(jìn)程ID,有以下幾種取值:
<-1:等待一個(gè)指定進(jìn)程組ID的任意子進(jìn)程
-1:等待任意子進(jìn)程
0:等待與調(diào)用進(jìn)程屬于同一個(gè)進(jìn)程組的任意子進(jìn)程
0:等待指定進(jìn)程ID的子進(jìn)程
status:用于存儲(chǔ)子進(jìn)程的狀態(tài)信息,可以為NULL
options:用于指定等待的選項(xiàng),可以為以下幾種取值的組合:
WNOHANG:非阻塞方式,即如果沒有終止的子進(jìn)程,則立即返回,不會(huì)阻塞等待
WUNTRACED:也會(huì)返回已經(jīng)停止的子進(jìn)程的狀態(tài)
返回值:
如果調(diào)用成功,返回值為終止子進(jìn)程的ID
如果調(diào)用失敗,返回值為-1,錯(cuò)誤碼存放在errno中
使用示例:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main() {
pid_t pid;
int status;
pid = fork(); // 創(chuàng)建子進(jìn)程
if (pid < 0) {
perror("fork error");
exit(1);
} else if (pid == 0) {
// 子進(jìn)程執(zhí)行的代碼
printf("Child process: pid=%d, ppid=%d\n", getpid(), getppid());
sleep(2);
exit(0);
} else {
// 父進(jìn)程執(zhí)行的代碼
printf("Parent process: pid=%d, childPid=%d\n", getpid(), pid);
waitpid(pid, &status, 0);
if (WIFEXITED(status)) {
printf("Child process exited normally with status: %d\n", WEXITSTATUS(status));
} else if (WIFSIGNALED(status)) {
printf("Child process terminated by signal: %d\n", WTERMSIG(status));
} else if (WIFSTOPPED(status)) {
printf("Child process stopped by signal: %d\n", WSTOPSIG(status));
}
}
return 0;
}
在上述示例中,父進(jìn)程通過fork創(chuàng)建了一個(gè)子進(jìn)程,子進(jìn)程打印自己的進(jìn)程ID和父進(jìn)程ID,并在2秒后退出。父進(jìn)程等待子進(jìn)程退出,并獲取子進(jìn)程的狀態(tài)信息。使用waitpid函數(shù)時(shí),傳入子進(jìn)程ID和status變量的地址,等待子進(jìn)程退出后,通過WIFEXITED、WIFSIGNALED、WIFSTOPPED等宏判斷子進(jìn)程的終止方式,并打印相應(yīng)的信息。