Child 个进程在 parent 个进程之后开始

Child process starts after parent process

我有一个简单的代码来测试 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);
        }
    }

它没有像我预期的那样工作。

我的预期是:parent的结果和child的结果交替出现。 有人可以解释一下并教我如何解决吗?谢谢!

    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

解释很简单。 进程的调度取决于内核。如果这是一个单核处理器,那么在这个 运行 中它决定暂停 child 执行并允许 parent 进程首先 运行。 parent 运行 循环数次后暂停 child,依此类推。
在多处理器系统中,两个进程可以 运行 串联,但控制台设备将根据中断时间交替输出。

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

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

主进程没有立即放弃控制,for 循环执行得如此之快以至于它在第二个进程被调度之前就完成了。当我执行您的代码时,我得到了非顺序打印,但该行为取决于系统。

有时在玩 fork() 时抛出 sleep() 命令会有所帮助。试试这个代码...

#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);
  }
}