(1) 编写一段程序,使用系统调用 fork( )创建两个子进程。 ⚫ 当此程序运行时,在系统中有一个父进程和两个子进程活动。 ⚫ 让每一个进程在屏幕上显示一个字符:父进程显示'a',子进程分别显示字符'b' 和字符'c'。 ⚫ 试观察记录屏幕上的显示结果,并分析原因。(2)改写程序:生成“father-son-grandson”关系 的三个进程。 要求:每个进程打印自己的PID号(循环打印 10次) 2. 改写程序:父进程利用fork生成两个子进程A B,之后A利用exec族函数运行ls -l, B利用 exec族函数运行ps –a 要求:父进程合理运用wait函数; 三个进程合理运用exit函数。
时间: 2023-11-22 18:54:29 浏览: 239
(1) 程序代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
pid_t pid1, pid2;
pid1 = fork();
if (pid1 < 0) {
fprintf(stderr, "Fork Failed");
exit(-1);
}
else if (pid1 == 0) {
printf("Child 1 (PID=%d) : b\n", getpid());
}
else {
pid2 = fork();
if (pid2 < 0) {
fprintf(stderr, "Fork Failed");
exit(-1);
}
else if (pid2 == 0) {
printf("Child 2 (PID=%d) : c\n", getpid());
}
else {
printf("Parent (PID=%d) : a\n", getpid());
}
}
return 0;
}
```
运行程序后,可能会得到如下输出:
```
Child 1 (PID=1234) : b
Child 2 (PID=1235) : c
Parent (PID=1233) : a
```
这是因为父进程先创建了两个子进程,但不确定哪个子进程先运行,因此输出顺序不确定。
(2) 程序代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
pid_t pid1, pid2;
printf("Grandfather (PID=%d) : %d\n", getpid(), getpid());
pid1 = fork();
if (pid1 < 0) {
fprintf(stderr, "Fork Failed");
exit(-1);
}
else if (pid1 == 0) {
printf("Father (PID=%d) : %d\n", getpid(), getpid());
for (int i = 0; i < 10; i++) {
printf("Father (PID=%d) : %d\n", getpid(), getpid());
pid2 = fork();
if (pid2 < 0) {
fprintf(stderr, "Fork Failed");
exit(-1);
}
else if (pid2 == 0) {
printf("Son (PID=%d) : %d\n", getpid(), getpid());
for (int j = 0; j < 10; j++) {
printf("Son (PID=%d) : %d\n", getpid(), getpid());
sleep(1);
}
exit(0);
}
else {
wait(NULL);
exit(0);
}
}
exit(0);
}
else {
wait(NULL);
exit(0);
}
return 0;
}
```
运行程序后,可能会得到如下输出:
```
Grandfather (PID=1233) : 1233
Father (PID=1234) : 1234
Father (PID=1234) : 1234
Son (PID=1235) : 1235
Son (PID=1235) : 1235
Son (PID=1235) : 1235
Son (PID=1235) : 1235
Son (PID=1235) : 1235
Son (PID=1235) : 1235
Son (PID=1235) : 1235
Son (PID=1235) : 1235
Son (PID=1235) : 1235
Father (PID=1234) : 1234
Son (PID=1236) : 1236
Son (PID=1236) : 1236
Son (PID=1236) : 1236
Son (PID=1236) : 1236
Son (PID=1236) : 1236
Son (PID=1236) : 1236
Son (PID=1236) : 1236
Son (PID=1236) : 1236
Son (PID=1236) : 1236
Son (PID=1236) : 1236
Father (PID=1234) : 1234
Son (PID=1237) : 1237
Son (PID=1237) : 1237
Son (PID=1237) : 1237
Son (PID=1237) : 1237
Son (PID=1237) : 1237
Son (PID=1237) : 1237
Son (PID=1237) : 1237
Son (PID=1237) : 1237
Son (PID=1237) : 1237
Son (PID=1237) : 1237
```
这是因为父进程创建了子进程A、B,并等待它们执行完毕,而子进程A使用 exec 函数运行了 ls -l 命令,子进程B使用 exec 函数运行了 ps -a 命令,因此输出了与程序无关的系统信息。
阅读全文