我们今天进行了一项学校练习,以创建多个流程。我们的问题不是代码本身也不是对fork()的理解。
我和我的伙伴的问题是为什么它没有创建我们代码的4个进程,如下所示:
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
//kod
int child1();
int child2();
int main() {
pid_t pid1, pid2;
int i;
pid1 = fork();
pid2 = fork();
if(!pid1)
child1();
else if(!pid2)
child2();
else {
printf("parentlolololololol");
}
for(;;)
return 0;
}
int child1(){
for(;;) {
printf("A");
fflush(stdout);
sleep(1);
}
return 0;
}
int child2(){
for(;;){
printf("B");
fflush(stdout);
sleep(1);
}
return 0;
}
我们讨论了程序是否创建了4个进程。第二个fork() - 调用是否创建了一个子进程的新进程,为什么它不被任何循环阻止?或者第二个fork() - 调用是否创建了一个新的子进程?
这与我们的练习无关,但我们非常好奇,因为你必须是一名程序员;)
答案 0 :(得分:1)
问题是这一行缺少分号:
for(;;)
return 0;
这意味着主程序将永远返回0 - 实际上只在第一次生效。
在第一个fork之后有两个进程,一个是pid1为0,另一个是pid1。 然后,这两个进程中的每一个都调用第二个fork语句 - 其中两个将具有pid2 == 0而两个不具有。
main ---> fork --> pid1 == 0 --> fork --> pid2 == 0 --> pid2 != 0 --> pid1 != 0 --> fork --> pid2 == 0 --> pid2 != 0
所以有4个过程。输入条件,两个被'child1'捕获,一个被'child2'捕获。主要流程退出。这使得3个进程运行,两个打印'A'和一个打印'B'。
答案 1 :(得分:0)
它确实 - 它无条件地分叉两次,创造了4个过程(好吧,3个新过程)。其中两个应该运行child1(),一个child2()和一个父代码。这是因为pid1 / pid2对有4个不同的值,第一个if覆盖其中两个。