`fork()`sons以相反的顺序执行

时间:2014-12-06 01:26:52

标签: c process fork

我有类似的代码:

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

2 个答案:

答案 0 :(得分:1)

多个进程可以同时输出到控制台,至少在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);
}

答案 1 :(得分:0)

要以正确的顺序执行子进程,只需在调用fork函数之前在循环内添加wait函数。

所以它将等到孩子终止并且子进程将以正确的顺序终止。

      for (i = 0; i < 3; i++)

            wait();
            pid = fork();

在添加等待函数后执行代码。