在Linux系统中,使用fork函数父进程创造子进程,fork()的值为判断条件,当fork()返回值=0,子进程暂停8秒,子进程退出。结束。fork()返回值>0时,父进程开始waitpid()判断,waitpid()的返回值,waitpid()返回值=0时,父进程暂停一秒,回到父进程waitpid(),如果waitpid返回值不为0,捕获子进程,退出。当fork()值<0时,结束。用C语言编写这个程序。
时间: 2024-03-16 19:44:41 浏览: 126
好的,以下是对应的 C 语言代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main() {
pid_t pid;
int status;
while ((pid = fork()) >= 0) { // 循环判断条件
if (pid == 0) { // 子进程
printf("child process %d starts\n", getpid());
sleep(8); // 暂停 8 秒
printf("child process %d ends\n", getpid());
exit(0);
} else { // 父进程
printf("parent process %d starts waiting for child process %d\n", getpid(), pid);
pid_t child;
do {
child = waitpid(pid, &status, WNOHANG); // 非阻塞等待子进程结束
if (child == pid) { // 子进程结束
printf("child process %d terminated\n", pid);
exit(0);
} else if (child < 0) { // 等待出错
perror("waitpid error");
exit(1);
} else { // 子进程还在运行
printf("child process %d still running\n", pid);
sleep(1); // 暂停 1 秒
}
} while (child == 0); // waitpid 返回 0,表示子进程还在运行,继续等待
}
}
perror("fork error");
exit(1);
}
```
这个程序中,使用一个 while 循环来判断条件,每次循环都会调用 `fork()` 函数创建一个子进程。如果 `fork()` 返回值小于 0,则表示创建子进程失败,直接退出程序。如果 `fork()` 返回值为 0,则表示当前进程是子进程,打印相应的信息后暂停 8 秒后退出。如果 `fork()` 返回值大于 0,则表示当前进程是父进程,打印相应的信息后开始等待子进程结束。在等待子进程结束的过程中,使用 `waitpid()` 函数进行非阻塞等待,每等待一次就判断子进程是否结束,如果结束则退出程序;如果子进程还在运行,则暂停 1 秒后再次等待,直到等待到了子进程结束。在结束子进程之前,使用 `do...while` 循环来等待子进程结束。需要注意的是,在 `waitpid()` 函数中使用了 `WNOHANG` 参数,表示非阻塞等待子进程结束。如果不加这个参数,则 `waitpid()` 函数会一直阻塞直到子进程结束,这显然不符合我们的需求。
阅读全文