(4)编写程序waitpid.c,使用waitpid()函数不断获取某进程中子进程的状态。
时间: 2024-05-07 11:22:02 浏览: 83
以下waitpid.c的代码:
```c
#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();
if (pid < 0) {
printf("Fork failed.\n");
exit(1);
}
else if (pid == 0) {
printf("I am the child process.\n");
sleep(5);
printf("Child process is done.\n");
exit(0);
}
else {
printf("I am the parent process.\n");
printf("Child process ID: %d\n", pid);
do {
pid = waitpid(-1, &status, WNOHANG);
if (pid > 0) {
if (WIFEXITED(status)) {
printf("Child process %d exited normally with status %d.\n", pid, WEXITSTATUS(status));
}
else if (WIFSIGNALED(status)) {
printf("Child process %d exited due to signal %d.\n", pid, WTERMSIG(status));
}
}
else if (pid == 0) {
printf("Child process is still running.\n");
sleep(1);
}
else {
printf("Error in waitpid().\n");
exit(1);
}
} while (pid == 0);
printf("Parent process is done.\n");
}
return 0;
}
```
在该程序中,我们使用了fork()函数创建了一个子进程,并使用waitpid()函数不断获取该子进程的状态。在子进程中,我们使用了sleep()函数来模拟一个耗时的操作。在父进程中,我们使用了do-while循环来不断调用waitpid()函数,直到子进程结束。当waitpid()函数返回时,我们根据状态参数来判断子进程是正常退出还是被信号终止。当子进程仍在运行时,我们使用了sleep()函数来暂停程序的执行一段时间,以避免空闲循环导致的资源占用。
阅读全文