4.编制程序,利用系统调用fork()创建两个子进程。程序运行时,系统中有一个父 进程和两个子进程活动,分别让他们显示“A”、“B”和“C”,分析程序运行结果。父进程等孩子全部退出后再退出。编写代码并给出详细注释
时间: 2023-07-16 19:13:15 浏览: 127
举例讲解C语言的fork()函数创建子进程的用法
下面是代码及注释:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main() {
pid_t pid1, pid2;
int status1, status2;
// 创建第一个子进程
pid1 = fork();
if (pid1 < 0) {
// 创建失败
perror("fork1");
exit(EXIT_FAILURE);
} else if (pid1 == 0) {
// 子进程1
printf("A\n");
exit(EXIT_SUCCESS);
}
// 创建第二个子进程
pid2 = fork();
if (pid2 < 0) {
// 创建失败
perror("fork2");
exit(EXIT_FAILURE);
} else if (pid2 == 0) {
// 子进程2
printf("B\n");
exit(EXIT_SUCCESS);
}
// 等待第一个子进程结束
waitpid(pid1, &status1, 0);
if (WIFEXITED(status1)) {
printf("Child 1 exited with status %d\n", WEXITSTATUS(status1));
}
// 等待第二个子进程结束
waitpid(pid2, &status2, 0);
if (WIFEXITED(status2)) {
printf("Child 2 exited with status %d\n", WEXITSTATUS(status2));
}
// 父进程退出
printf("C\n");
exit(EXIT_SUCCESS);
}
```
程序中首先使用 `fork()` 创建了两个子进程,分别打印 “A” 和 “B”。然后使用 `waitpid()` 等待子进程结束,打印子进程的退出状态,最后父进程打印 “C” 并退出。
程序输出结果为:
```
A
B
Child 1 exited with status 0
Child 2 exited with status 0
C
```
可以看出,父进程等待两个子进程结束后才会打印 “C”,这是因为父进程在调用 `waitpid()` 时会阻塞等待子进程结束。同时,可以看出子进程的执行顺序可能是任意的,因为操作系统会根据进程调度算法分配 CPU 时间片。
阅读全文