溫馨提示×

Linux的waitpid()函數(shù)怎么使用

小億
104
2023-09-05 17:42:54
欄目: 智能運維

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)。

0