C语言fork()系统调用创建子进程示例及运行结果分析
使用fork()创建子进程并观察运行结果
本文将通过两个简单的C语言程序示例,演示使用fork()系统调用创建子进程,并对运行结果进行分析。
示例1:单个字符输出
代码:
#include <stdio.h>
#include <unistd.h>
int main() {
pid_t pid1, pid2;
pid1 = fork();
if (pid1 < 0) {
printf("fork error");
} else if (pid1 == 0) {
printf('c\n');
} else {
pid2 = fork();
if (pid2 < 0) {
printf("fork error");
} else if (pid2 == 0) {
printf('b\n');
} else {
printf('a\n');
}
}
return 0;
}
运行结果:
由于进程调度的不确定性,输出结果可能会有不同。但是大多数情况下,输出结果应该是:
b
c
a
原因:
- 父进程先执行,输出'a',然后创建了两个子进程。
- 其中一个子进程先执行,输出'b',另一个子进程紧接着执行,输出'c'。
示例2:循环输出字符串
代码:
#include <stdio.h>
#include <unistd.h>
int main() {
pid_t pid1, pid2;
pid1 = fork();
if (pid1 < 0) {
printf("fork error");
} else if (pid1 == 0) {
while (1) {
printf('daughter ...\n');
sleep(1);
printf('son ...\n');
sleep(1);
}
} else {
while (1) {
printf('parent ...\n');
sleep(1);
}
}
return 0;
}
运行结果:
由于进程调度的不确定性,输出结果可能会有不同。但是大多数情况下,输出结果应该是:
parent ...
daughter ...
parent ...
son ...
parent ...
daughter ...
parent ...
son ...
...
原因:
- 父进程先执行,创建了两个子进程。
- 子进程进入死循环,一直输出自己的名字,每次输出后等待1秒钟。
- 父进程也进入死循环,一直输出自己的名字,每次输出后等待1秒钟。
- 由于进程调度的不确定性,每个进程的输出顺序可能不同,但是每个进程的输出都会持续不断地进行。
总结:
通过这两个示例,我们可以了解到使用fork()系统调用创建子进程的基本方法,以及进程调度机制导致的运行结果的不确定性。在实际应用中,需要根据具体需求进行合理的代码设计,以确保程序能够按照预期执行。
原文地址: https://www.cveoy.top/t/topic/kFtQ 著作权归作者所有。请勿转载和采集!