在Cygwin(在Windows上)和Linux中Fork()不同吗

在Cygwin(在Windows上)和Linux中Fork()不同吗,linux,windows,cygwin,fork,pid,Linux,Windows,Cygwin,Fork,Pid,我在Linux和Cygwin(在Windows上)中都使用了这段代码,输出顺序不同,我不知道为什么 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> int main() { pid_t pid; /* fork a child process */ pid = fork();

我在Linux和Cygwin(在Windows上)中都使用了这段代码,输出顺序不同,我不知道为什么

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>



int main()
{
        pid_t pid;

        /* fork a child process */
        pid = fork();

        printf("\n PID1 %d\n",pid);

        pid = fork();

        printf("\n PID2 %d\n",pid);

        return 0;
}
但在Linux(和MAC)中,它看起来像

PID1 2486

 PID2 2487

 PID2 0

 PID1 0

 PID2 2488

 PID2 0


我的问题是,在Linux中,PID2(PID22487)位于PID1之前,但在Windows中不在此列(每次运行代码时,输出行为都是相同的)

未指定进程在post fork中运行的顺序。

未指定进程在post fork中运行的顺序。

在fork()之后,不确定父进程或子进程下一个可以访问CPU。在多处理器系统上,它们可能同时访问CPU。操作系统允许您控制此顺序。例如,Linux的/proc/sys/kernel/sched_child_首先运行。

在fork()之后,不确定父进程或子进程下一个可以访问CPU。在多处理器系统上,它们可能同时访问CPU。操作系统可以允许您控制此顺序。例如,Linux首先运行/proc/sys/kernel/sched_child_。

我猜您正在通过Cygwin使用
fork
?是的,
fork
是Linux上的原子系统调用。它在Windows上不存在(因此以复杂的方式模拟)。感谢您的回复。是的,我知道。我猜你正在通过Cygwin使用
fork
?是的,
fork
是Linux上的一个原子系统调用。它在Windows上不存在(因此以复杂的方式模拟)。感谢您的回复。是的,谢谢你的回复,因为我知道孩子和父母之间的顺序是不确定的。但在我的例子中,PID2(对于第二个fork())在Linux中总是在PID1之前,而不是在Windows中。我唯一的想法是,Linux和MAC中的终端输出缓冲与此有关。所谓“始终”,实际上是指“每次我尝试”。所有这一切真正意味着,某些东西正在强烈地影响结果。。。可能一些实现细节会发生变化,甚至可能只是一些不相关的差异,比如所讨论的两台计算机的模型。有时也可能会发生相反的情况,只是不经常让您看到。更好的是:如果运气好的话,在多核系统上,家长和孩子可以完美地安排在同一时间。感谢您的回复,因为我知道孩子和家长之间的顺序尚未确定。但在我的例子中,PID2(对于第二个fork())在Linux中总是在PID1之前,而不是在Windows中。我唯一的想法是,Linux和MAC中的终端输出缓冲与此有关。所谓“始终”,实际上是指“每次我尝试”。所有这一切真正意味着,某些东西正在强烈地影响结果。。。可能一些实现细节会发生变化,甚至可能只是一些不相关的差异,比如所讨论的两台计算机的模型。有时可能会发生相反的情况,只是不经常让您看到。更好的是:如果运气好的话,在多核系统上,父级和子级可以完美地同时调度。如果我听起来很幼稚,我真的很抱歉,但这是否适用于同一代码中的所有父级和子级(我的代码中有两个分叉)所以我把这想象成爷爷和他的孩子,他们是孙子的父母。孙子可以在父母(这是原始代码的孩子)之前申请吗?请注意,即使您的进程在CPU上获得了第一个DIB,也不能绝对保证它会在另一个进程之前完成输出写入。例如,如果当前的时间片即将结束,或者如果其他事情(如硬件中断)使您速度减慢,则可能不会发生这种情况。@user3382285如果您不能100%确定正在执行的进程的顺序,则最好实施同步技术。如果我听起来很幼稚,我真的很抱歉,但这是否适用于同一代码中的所有父母和孩子(我的代码中有两个叉子),所以我想象这就像爷爷和他的孩子是孙子的父母一样。孙子可以在父母(这是原始代码的孩子)之前申请吗?请注意,即使您的进程在CPU上获得了第一个DIB,也不能绝对保证它会在另一个进程之前完成输出写入。例如,如果当前时间片即将结束,或者如果其他事情(如硬件中断)使您速度减慢,则可能不会发生这种情况。@user3382285如果您不能100%确定正在执行的进程的顺序,则最好实施同步技术。
PID1 2486

 PID2 2487

 PID2 0

 PID1 0

 PID2 2488

 PID2 0