This question already has answers here:
In fork() which will run first, parent or child?
                                
                                    (2个答案)
                                
                        
                                5年前关闭。
            
                    
我有类似的代码:

for (i = 0; i < 3; i++)
{
    pid = fork();

    if (pid == 0)
    {
        son_function();
    }

    if (pid < 0)
    {
        exit(1);
    }
}

void son_function(void)
{
    printf("my pid=%d\n", getpid());
    printf("%d: alpha\n", getpid());
    printf("%d: beta\n", getpid());
    printf("%d: charlie\n", getpid());
    exit(0);
}


由于某种原因,我无法理解,son_function()的执行顺序是相反的。我的意思是son_function()从最大到最小打印PID数字。

令我感到惊讶的另一件事是,每个儿子的照片将一个接一个地打印,不可能将来自两个不同过程的两个打印同时打印到屏幕上。

示例可以在这里看到:http://ideone.com/uBYyRX

最佳答案

至少在Windows和Linux下,多个进程可以同时输出到控制台。

之所以会在所有其他进程之前看到一个进程,是因为您的操作系统调度线程的方式。观察此行为的更好方法是将son_function更改为类似于下面的代码,其中每个孩子的睡眠时间不同。行交错的原因(如前所述)是因为printf缓冲了输出行。

void son_function()
{
    srandom(getpid());
    int sleepTime = random() % 4; // random sleep between 0 and 3 seconds
    printf("pid [%d] sleep time is %d\n", getpid(), sleepTime);

    printf("my pid = %d\n", getpid());
    sleep(sleepTime);
    printf("alpha = %d\n", getpid());
    sleep(sleepTime);
    printf("beta = %d\n", getpid());
    sleep(sleepTime);
    printf("charlie = %d\n", getpid());
    sleep(sleepTime);
}

07-26 05:53