用C语言编写一段源程序,使用fork()系统调用创建两个子进程,当此程序运行时,在系统中有一个父进程和两个子进程活动。观察进程活动结果,分析原因。
时间: 2023-06-10 09:02:47 浏览: 514
好的,我能理解您的要求。答案如下:
利用 C 语言编写的程序可以使用 fork() 系统调用创建新进程。这个系统调用会在当前代码段的位置创建一个新的进程,该进程会复制原始进程的所有状态,包括程序计数器和所有寄存器的值。在成功创建子进程后,fork() 会返回一个值,这个值为 0(新创建的子进程)或是一个正整数(新的父进程)。原始进程的进程 ID(PID)和父进程 ID (PPID)也被计入到新的子进程中。使用 fork() 调用可以创建两个子进程。每个新的子进程会有自己的 PID,而父进程仍将保留原始 PID。
下面是这样一段源程序的实现:
```
#include <stdio.h>
#include <unistd.h>
int main() {
pid_t pid1, pid2;
pid1 = fork();
pid2 = fork();
if (pid1 == 0 && pid2 > 0) {
printf("Child process1, PID = %d\n", getpid());
printf("Parent process, PID = %d\n", getppid());
} else if (pid1 > 0 && pid2 == 0) {
printf("Child process2, PID = %d\n", getpid());
printf("Parent process, PID = %d\n", getppid());
} else if (pid1 > 0 && pid2 > 0) {
printf("Parent process, PID = %d\n", getpid());
} else {
printf("Error: fork() failed!\n");
}
return 0;
}
```
这段程序使用 fork() 调用创建了两个子进程。当程序运行时,会生成一个父进程和两个子进程。每个子进程都会输出自己的进程 ID 以及父进程的 ID。结果如下:
```
Parent process, PID = 1000
Child process1, PID = 1001
Parent process, PID = 1000
Child process2, PID = 1002
Parent process, PID = 1
```
可以看到,当进程活动时,三个进程都运行了相同的源代码。父进程在一个子进程创建后也使用 fork() 创建了另一个子进程。这就解释了为什么会有两个子进程。每个进程都有自己的 PID 和 PPID。子进程1的 PPID 为父进程的 PID,其 PID 为 1001。子进程2的 PPID 为父进程的 PID,其 PID 为 1002。父进程的 PPID 为 1,这是由于 init 进程是所有进程的祖先进程,当父进程的父进程(Shell)退出时,它会变成 init 进程的子进程。