当我编译此代码并运行它时,我得到一个结果“PARENT”出现在“CHILD”之前。 有关我在Linux Mint上的信息。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
void main(){
pid_t pidc ;
pidc = fork();
if(pidc < 0)
{printf("error !\n");}
else if(pidc == 0){
printf("I am the child process! \n");
}
else{
printf("I am the parent process! \n");
}
}
这是结果:
我是父进程!
我是孩子的过程!
那么,有人有想法吗?并谢谢。
答案 0 :(得分:1)
一旦你fork
编辑,结果两个进程基本上独立运行。您不会假设父级将在子级之前运行(反之亦然),而不添加某种机制来强制它这样做。
答案 1 :(得分:0)
这被称为竞争条件。您需要有一种机制来同步这两个进程。
答案 2 :(得分:0)
我只需添加'等待(NULL)',谢谢大家。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
void main(){
pid_t pidc ;
pidc = fork();
if(pidc < 0)
{printf("error !\n");}
else if(pidc == 0){
printf("I am the child process! \n");
}
else{
wait(NULL);
printf("I am the parent process! \n");
}
}
答案 3 :(得分:0)
您可能会感到困惑,因为子进程的if
条件发生在父if
条件之前。
当您致电fork()
时,您的现有流程将被克隆到新流程中。原始进程将从fork()
调用中收到子PID的返回值,该子进程将获得0
的PID。
fork()
成功后,两个进程将并行运行。要并行运行,进程会在执行期间获得一小段时间,并且在执行结束时,它们会在另一个进程执行时暂时冻结。您无法知道两个进程中的哪一个将首先执行。父进程和子进程都将在fork()
调用之后开始执行相同的代码,但由于pidc
的值不同,它们将选择if
语句的不同分支。因此,第一个进程恰好被赋予一段将首先输出的执行时间,if
语句的顺序不相关。