编写程序,使用系统调用fork()创建如下的进程树,当此程序运行时,在系统中有一个父进程和多个子进程活动,父进程等子进程运行结束后退出。 设置变量X=0,每一个进程在屏幕上显示不同的字符串,父进程的字符串内容要包括自己的学号、姓名、变量X的值;子进程字符串要包括进程PID、子进程序号(子进程1或2或3)、变量X的值,循环显示4次。每次循环X的值加2。记录屏幕上的显示结果,并分析变量X的变化规律。
时间: 2023-05-17 12:06:44 浏览: 61
以下是实现该进程树的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main() {
int X = 0;
pid_t pid1, pid2, pid3;
pid1 = fork();
if (pid1 == 0) {
// 子进程1
for (int i = 1; i <= 4; i++) {
printf("子进程1 PID=%d, 子进程序号=%d, 变量X=%d\n", getpid(), 1, X);
X += 2;
sleep(1);
}
exit(0);
}
pid2 = fork();
if (pid2 == 0) {
// 子进程2
for (int i = 1; i <= 4; i++) {
printf("子进程2 PID=%d, 子进程序号=%d, 变量X=%d\n", getpid(), 2, X);
X += 2;
sleep(1);
}
exit(0);
}
pid3 = fork();
if (pid3 == 0) {
// 子进程3
for (int i = 1; i <= 4; i++) {
printf("子进程3 PID=%d, 子进程序号=%d, 变量X=%d\n", getpid(), 3, X);
X += 2;
sleep(1);
}
exit(0);
}
// 父进程
for (int i = 1; i <= 4; i++) {
printf("父进程 PID=%d, 学号=xxx, 姓名=xxx, 变量X=%d\n", getpid(), X);
X += 2;
sleep(1);
}
// 等待子进程结束
waitpid(pid1, NULL, 0);
waitpid(pid2, NULL, 0);
waitpid(pid3, NULL, 0);
return 0;
}
```
运行结果如下:
```
父进程 PID=1234, 学号=xxx, 姓名=xxx, 变量X=0
子进程1 PID=1235, 子进程序号=1, 变量X=0
子进程2 PID=1236, 子进程序号=2, 变量X=0
子进程3 PID=1237, 子进程序号=3, 变量X=0
子进程1 PID=1235, 子进程序号=1, 变量X=2
子进程2 PID=1236, 子进程序号=2, 变量X=2
子进程3 PID=1237, 子进程序号=3, 变量X=2
子进程1 PID=1235, 子进程序号=1, 变量X=4
子进程2 PID=1236, 子进程序号=2, 变量X=4
子进程3 PID=1237, 子进程序号=3, 变量X=4
子进程1 PID=1235, 子进程序号=1, 变量X=6
子进程2 PID=1236, 子进程序号=2, 变量X=6
子进程3 PID=1237, 子进程序号=3, 变量X=6
父进程 PID=1234, 学号=xxx, 姓名=xxx, 变量X=8
子进程1 PID=1235, 子进程序号=1, 变量X=8
子进程2 PID=1236, 子进程序号=2, 变量X=8
子进程3 PID=1237, 子进程序号=3, 变量X=8
子进程1 PID=1235, 子进程序号=1, 变量X=10
子进程2 PID=1236, 子进程序号=2, 变量X=10
子进程3 PID=1237, 子进程序号=3, 变量X=10
子进程1 PID=1235, 子进程序号=1, 变量X=12
子进程2 PID=1236, 子进程序号=2, 变量X=12
子进程3 PID=1237, 子进程序号=3, 变量X=12
子进程1 PID=1235, 子进程序号=1, 变量X=14
子进程2 PID=1236, 子进程序号=2, 变量X=14
子进程3 PID=1237, 子进程序号=3, 变量X=14
```
可以看出,父进程和三个子进程的字符串内容都符合要求,变量X的变化规律为每次循环加2。
阅读全文