4)提交源程序清单,并附加流程图与注释。 并回答以下问题: 1) 系统调用fork()是怎样创建进程的? 2)当首次调用新创建的子进程时,其入口在哪里? 3)分析进程调度和进程并发执行的关系?
时间: 2024-03-20 21:39:33 浏览: 83
(修改版)实现进程的软中断通信。要求:使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断
4星 · 用户满意度95%
以下是程序的源代码清单、流程图和注释:
```c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main() {
pid_t pid1, pid2;
pid1 = fork(); // 创建第一个子进程
if (pid1 == 0) { // 如果是子进程1
printf("b\n"); // 在屏幕上显示字符b
} else if (pid1 > 0) { // 如果是父进程
pid2 = fork(); // 创建第二个子进程
if (pid2 == 0) { // 如果是子进程2
printf("c\n"); // 在屏幕上显示字符c
} else if (pid2 > 0) { // 如果是父进程
printf("a\n"); // 在屏幕上显示字符a
} else { // 如果创建子进程2失败
printf("Fork failed.\n");
return 1;
}
} else { // 如果创建子进程1失败
printf("Fork failed.\n");
return 1;
}
return 0;
}
```
流程图如下:
```
+---------+
| 父进程 |
+---------+
|
|
v
+---------+
| 子进程1 |
+---------+
|
|
v
+---------+
| 子进程2 |
+---------+
```
1)系统调用fork()是通过复制父进程的所有内容(包括代码、数据、堆栈等)来创建一个新的子进程。
2)当首次调用新创建的子进程时,其入口在fork()返回的位置,因为子进程会继续执行父进程的代码。
3)在这个程序中,父进程和两个子进程会同时运行,因为它们是并发执行的。进程调度器会在它们之间进行上下文切换,以便它们都有机会运行。由于每个进程只需要在屏幕上显示一个字符,所以它们的运行时间很短,因此并发执行不会导致明显的性能问题。如果使用系统调用nice()来改变进程的优先级,那么优先级高的进程会更频繁地被调度,优先级低的进程会更少被调度。这可能会导致优先级低的进程在屏幕上显示的字符较少。
阅读全文