子进程在父进程之后启动

时间:2015-07-03 03:44:25

标签: c linux fork

我有一个简单的代码来测试fork()函数。

    #include<stdio.h>
    #include<unistd.h>
    #define MAX_COUNT 10
    void main(void)
    {
        pid_t pid;
        int i;
        fork();
        pid = getpid();
        for(i = 1; i <= MAX_COUNT; i++)
        {
            printf("PID = %d, i = %d\n", pid, i);
        }
    }

它没有像我预期的那样奏效。

我的期望是:父母的结果和孩子的结果交替出现。 有人可以解释这个并教我如何解决它吗?谢谢!

    PID = 3663, i = 1
    PID = 3663, i = 2
    PID = 3663, i = 3
    PID = 3663, i = 4
    PID = 3663, i = 5
    PID = 3663, i = 6
    PID = 3663, i = 7
    PID = 3663, i = 8
    PID = 3663, i = 9
    PID = 3663, i = 10
    PID = 3664, i = 1
    PID = 3664, i = 2
    PID = 3664, i = 3
    PID = 3664, i = 4
    PID = 3664, i = 5
    PID = 3664, i = 6
    PID = 3664, i = 7
    PID = 3664, i = 8
    PID = 3664, i = 9
    PID = 3664, i = 10

2 个答案:

答案 0 :(得分:11)

解释很简单。 进程的调度取决于内核。如果这是一个单核处理器,那么在此运行中它决定暂停子执行并允许父进程首先运行。父母在被暂停以支持孩子之前跑了几圈,等等 在多处理器系统中,两个进程可以串联运行,但控制台设备将根据中断的时间交替输出。

无法保证不同的运行会产生相同的输出。也无法保证不同的内核版本不会做其他事情。

如果您希望流程在循环之间交替,现在是学习interprocess communication的时间。

答案 1 :(得分:2)

主要过程不立即放弃控制,并且for循环执行得太快以至于在第二个过程被调度之前完成。当我执行你的代码时,我得到非顺序打印,但行为是系统相关的。

当您与sleep()一起玩时,有时会抛出fork()个命令。试试这段代码......

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

#define MAX_COUNT 10
int main(void)
{
  pid_t pid;
  int i;
  fork();

  pid = getpid();

  srand(pid); // Make sure each process has a different seed

  for(i = 1; i <= MAX_COUNT; i++)
  {
    printf("PID = %d, i = %d\n", pid, i);

    // Sleep 1-3 seconds.
    unsigned int sleep_seconds = rand() % 3 + 1;
    sleep(sleep_seconds);
  }
}