【问题标题】:how does the program control switch between fork calls程序控制如何在fork调用之间切换
【发布时间】:2014-04-17 07:43:31
【问题描述】:

我最近开始了解 fork() 系统调用,并编写了以下程序。 我在下面的程序中的疑问在于它的输出。为什么程序只打印父 printf 的前十行,然后移动到子 printf 中的打印语句,然后再次返回父 printf 中的打印语句。这是如何工作的?

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

int main()
{
    pid_t newpid;
    int i =0;

    newpid=fork();
    if(newpid==0)
    {
        for(i=0;i<10;i++)
        {
            printf("child process pid %d number %d \n", newpid,i);
        }
    }
    else
    {

        for(i=0;i<20;i++)
        {
            printf("parent process pid %d number %d \n", newpid,i);
        }

    }
    return 0;
}

输出:

parent process pid 9224 number 0
parent process pid 9224 number 1
parent process pid 9224 number 2
parent process pid 9224 number 3
parent process pid 9224 number 4
parent process pid 9224 number 5
parent process pid 9224 number 6
parent process pid 9224 number 7
parent process pid 9224 number 8
parent process pid 9224 number 9
child process pid 0 number 0
parent process pid 9224 number 10
parent process pid 9224 number 11
parent process pid 9224 number 12
parent process pid 9224 number 13
parent process pid 9224 number 14
parent process pid 9224 number 15
child process pid 0 number 1
parent process pid 9224 number 16
child process pid 0 number 2
parent process pid 9224 number 17
child process pid 0 number 3
parent process pid 9224 number 18
parent process pid 9224 number 19
child process pid 0 number 4
child process pid 0 number 5
child process pid 0 number 6
child process pid 0 number 7
child process pid 0 number 8
child process pid 0 number 9

【问题讨论】:

  • 因为在fork之后有两个进程独立运行。
  • 因为有两个进程同时运行,并且在您的情况下它们共享同一个终端,因此输出会交错。

标签: c unix fork system system-calls


【解决方案1】:

通过 fork() 您完全创建了一个具有自己地址空间的新进程。这是子进程。父母是创造孩子的人。它们共享相同的代码和输出终端。它们独立调度由操作系统运行。因此,您无法预测看到父母打印和孩子打印的顺序。而且它们肯定不会按顺序排列,这就是您看到交错打印的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    • 2016-05-17
    • 2012-05-09
    相关资源
    最近更新 更多