C 子进程在创建时从第一行开始(使用fork)

C 子进程在创建时从第一行开始(使用fork),c,linux,fork,child-process,C,Linux,Fork,Child Process,为什么我的孩子的过程从主线的第一行开始?当我运行我的程序时,“Hello There”将被打印两次。子进程应该在fork之后的行上启动,对吗 int main(){ printf("Hello There!"); pid_t PID; PID = fork(); if(PID == 0){ //Child } else{ //parent } } 这对我来

为什么我的孩子的过程从主线的第一行开始?当我运行我的程序时,“Hello There”将被打印两次。子进程应该在fork之后的行上启动,对吗

int main(){
       printf("Hello There!");
       pid_t PID;
       PID = fork();

       if(PID == 0){
          //Child
       }
       else{
          //parent
       }
}
这对我来说是个大问题,因为在我的实际程序中,我在fork之前使用mmap生成私有文件。正因为如此,我的父母和孩子拥有不同的私人文件。

它不会被调用两次。。。这是一种视错觉!:)

但是。。。您的标准输出没有被刷新,因为没有\n,您的fork正在复制您的整个状态,两个进程都在继续,最后它们都刷新,都刷新了它们的输出缓冲区(在fork()期间复制),并导致输出出现两次

如果您添加了\n,请按如下方式更改printf行:

printf("Hello There!\n");
现在您将获得预期的结果

或显式刷新输出:

printf("Hello There!");
fflush(stdout);

没有。孩子从
fork()返回后立即启动。展示你的全部代码(或者,更好的是,将你的全部代码缩减为a)--问题出在其他地方。。。在C语言中,对于“普通”变量,我们通常使用小写或camelCase,尽管这样做在语法上没有错。抱歉,忽略了一个小事实,即您从不刷新(既不通过换行符的输出隐式刷新,也不显式刷新,例如,
fflush()
)您的stdout:)参见Michael的答案,这里可能很关键,所以问题确实出现在您的示例代码中我猜你可以回到你的第一个版本——再次道歉。@FelixPalmen呵呵,这是一个肮脏狡猾的邪恶鬼鬼祟祟的小潜伏者,不是吗,我读了这个问题,和你的想法一样“不可能”,但我粘贴了它,编译了它,我的眼睛几乎从眼窝里跳出来!我花了一分钟的时间用gdb和一些测试来解决这个问题。@Michael“有龙”似乎经常用C。是的,的确如此,而且做得很好:)足够有趣,可以对问题和答案进行投票!隐马尔可夫模型。。。这可能确实是解决办法!建议将“不被打印两次”改为“printf()不被调用两次”,并添加手动刷新和缓冲模式:)是的,公正的评论,完成了。谢谢,这是打印两次的原因!但我仍然有一个问题:/我有一个上下文为“Hello”的文件,我用mmap从中创建了一个私有文件。然后,我的孩子添加到私有文件“World”的末尾,但从父级看不到这一点,即使我以前做过mmappingfork@Someguy建议提出另一个问题,只是为了对未来读者有所帮助:)好吧,这是另一个问题中最好的措辞,这里没有足够的信息来处理这个问题,如果你现在编辑你的问题,因为它已经被回答并获得了投票权,这只会让每个人都感到困惑。