Linux编写程序,使用waitpid函数不断获取某进程中子进程的状态
时间: 2024-01-02 10:02:22 浏览: 116
Linux进程控制编程-waitpid函数实例.pdf
waitpid函数可以用于等待一个特定的子进程或等待任何一个子进程。如果使用waitpid等待一个特定的子进程,需要传递该子进程的PID作为参数。如果使用waitpid等待任何一个子进程,则只需要将pid参数设置为-1即可。
以下是一个使用waitpid函数等待子进程状态的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main() {
pid_t pid = fork();
if (pid == 0) {
// 子进程
printf("子进程正在运行...\n");
sleep(5);
printf("子进程结束\n");
exit(0);
} else if (pid > 0) {
// 父进程
int status;
pid_t child_pid;
do {
child_pid = waitpid(pid, &status, WUNTRACED | WCONTINUED);
if (child_pid == -1) {
perror("waitpid");
exit(EXIT_FAILURE);
}
if (WIFEXITED(status)) {
printf("子进程 %d 正常结束,退出状态码 %d\n", child_pid, WEXITSTATUS(status));
} else if (WIFSIGNALED(status)) {
printf("子进程 %d 被某个信号终止,终止信号 %d\n", child_pid, WTERMSIG(status));
} else if (WIFSTOPPED(status)) {
printf("子进程 %d 被某个信号停止,停止信号 %d\n", child_pid, WSTOPSIG(status));
} else if (WIFCONTINUED(status)) {
printf("子进程 %d 被继续执行\n", child_pid);
}
} while (!WIFEXITED(status) && !WIFSIGNALED(status));
printf("父进程结束\n");
exit(EXIT_SUCCESS);
} else {
perror("fork");
exit(EXIT_FAILURE);
}
}
```
在上面的代码中,当父进程调用waitpid函数等待子进程时,它会不断轮询子进程的状态,直到子进程正常结束、被信号终止或被信号停止。根据不同的状态,父进程会打印不同的信息。当子进程结束后,父进程也会结束。
注意,waitpid函数会阻塞父进程,直到子进程状态发生改变。如果父进程不希望阻塞,可以将options参数设置为WNOHANG,这样waitpid函数会立即返回,如果没有任何子进程状态发生改变,返回值为0。
阅读全文