温馨提示×

Linux的waitpid()函数怎么使用

小亿
131
2023-09-05 17:42:54
栏目: 智能运维

waitpid()函数是用来等待子进程结束的函数,其原型如下:

#include <sys/types.h> #include <sys/wait.h> pid_t waitpid(pid_t pid, int *status, int options); 

参数说明:

  • pid:指定要等待的子进程ID,可以是具体的进程ID,也可以是以下值之一:

  • -1:等待任意子进程结束;

  • 0:等待和调用进程属于同一个进程组的任意子进程结束;

  • 大于0的值:等待指定进程ID的子进程结束。

  • status:用于存储子进程的退出状态信息,如果不关心子进程的退出状态,可以将该参数设为NULL

  • options:设置等待的选项,常用的选项包括:

  • WUNTRACED:如果子进程进入暂停状态,则立即返回;

  • WCONTINUED:如果子进程由暂停状态变为继续运行状态,则立即返回;

  • WNOHANG:如果没有子进程退出或者进入暂停状态,则立即返回0,而不阻塞等待。

返回值:

  • 如果调用成功,返回子进程的进程ID;

  • 如果调用失败,返回-1。

下面是一个示例代码,演示了如何使用waitpid()函数等待子进程结束:

#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 < 0) { perror("fork"); exit(1); } else if (pid == 0) { // 子进程执行的代码 printf("Child process: My PID is %d\n", getpid()); sleep(2); // 子进程休眠2秒 exit(0); // 子进程退出 } else { // 父进程执行的代码 printf("Parent process: My PID is %d\n", getpid()); int status; pid_t child_pid = waitpid(pid, &status, 0); // 等待子进程结束 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以及子进程的退出状态。

0