Дочерний процесс запускается после родительского процесса

у меня есть простой код для тестирования

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