linux环境 waitpid函数的使用
时间: 2023-12-02 11:04:45 浏览: 75
Linux进程控制编程-waitpid函数实例.pdf
waitpid函数用于等待指定的子进程结束,并回收它的资源。其函数原型如下:
```c
#include <sys/types.h>
#include <sys/wait.h>
pid_t waitpid(pid_t pid, int *status, int options);
```
其中,pid参数表示要等待的子进程的进程ID。如果pid为-1,表示等待任何一个子进程结束;如果pid大于0,表示等待进程ID为pid的子进程结束;如果pid为0,表示等待当前进程组内的任何一个子进程结束;如果pid小于-1,表示等待进程组ID为pid绝对值的任何子进程结束。
status参数是一个指向int类型的指针,用于存储子进程的终止状态信息。如果不关心子进程的终止状态,可以将该参数设置为NULL。
options参数指定waitpid的行为。可以通过以下宏来指定:
- WNOHANG:表示如果没有子进程退出,则立即返回,而不是阻塞等待。
- WUNTRACED:表示如果子进程进入暂停状态,则立即返回。
- WCONTINUED:表示如果子进程恢复运行,则立即返回。
waitpid函数的返回值为子进程的进程ID,如果出错则返回-1。
下面是一个使用waitpid函数的示例程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main()
{
pid_t pid;
int status;
pid = fork();
if (pid == 0) {
printf("I am child process, pid=%d\n", getpid());
sleep(5);
exit(0);
} else if (pid > 0) {
printf("I am parent process, pid=%d\n", getpid());
waitpid(pid, &status, 0);
if (WIFEXITED(status)) {
printf("child process exit normally with status=%d\n", WEXITSTATUS(status));
} else if (WIFSIGNALED(status)) {
printf("child process exit by signal=%d\n", WTERMSIG(status));
}
} else {
perror("fork error");
exit(1);
}
return 0;
}
```
该程序创建一个子进程,并等待子进程结束。在子进程中,先输出一行信息,然后暂停5秒钟后退出;在父进程中,等待子进程结束后输出子进程的终止状态信息。注意,子进程的退出状态需要通过WIFEXITED和WEXITSTATUS宏来获取,如果子进程是被信号杀死的,则需要通过WIFSIGNALED和WTERMSIG宏来获取信号编号。
阅读全文