Как действительно работает системный вызов fork

У меня очень специфический вопрос о системном вызове fork. У меня есть эта часть кода:

int main (void) { for (int i = 0; i < 10; i++) { pid_t pid = fork (); if ( !pid ) { printf("CHILD | PID: %d, PPID: %d\n", getpid(), getppid()); _exit(i + 1); } } for (int i = 0; i < 10; i++) { int status; waitpid(-1, &status, 0); if (WIFEXITED(status)) { printf("IM %d AND CHILD WITH EXIT CODE %d TERMINATED\n", getpid(), WEXITSTATUS(status)); } else { printf("ERROR: CHILD NOT EXITED\n"); } } return 0; } 

который производит этот выход:

 CHILD | PID: 3565, PPID: 3564 CHILD | PID: 3566, PPID: 3564 IM 3564 AND CHILD WITH EXIT CODE 1 TERMINATED IM 3564 AND CHILD WITH EXIT CODE 2 TERMINATED CHILD | PID: 3573, PPID: 3564 CHILD | PID: 3567, PPID: 3564 IM 3564 AND CHILD WITH EXIT CODE 9 TERMINATED IM 3564 AND CHILD WITH EXIT CODE 3 TERMINATED CHILD | PID: 3568, PPID: 3564 IM 3564 AND CHILD WITH EXIT CODE 4 TERMINATED CHILD | PID: 3569, PPID: 3564 IM 3564 AND CHILD WITH EXIT CODE 5 TERMINATED CHILD | PID: 3570, PPID: 3564 IM 3564 AND CHILD WITH EXIT CODE 6 TERMINATED CHILD | PID: 3571, PPID: 3564 IM 3564 AND CHILD WITH EXIT CODE 7 TERMINATED CHILD | PID: 3572, PPID: 3564 IM 3564 AND CHILD WITH EXIT CODE 8 TERMINATED CHILD | PID: 3574, PPID: 3564 IM 3564 AND CHILD WITH EXIT CODE 10 TERMINATED 

что заставляет меня задаться вопросом, как действительно работает вилка и какой код выполняет действительно новые процессы. Рассматривая приведенные выше результаты, я не могу понять:

  1. Как второй раз для печати цикла перед первым для завершения всех итераций? Я также заметил, что эта секунда для всегда выполняется родительским процессом, что заставляет меня задаться вопросом, если вначале для цикла , if pid != 0 (что означает вызов родительского процесса), второй для цикла выполняется (?)
  2. Почему процессы CHILD не отсортированы, напечатанные PID?

Итак, в нижней строке, как работает вилка и кто что выполняет?

One Solution collect form web for “Как действительно работает системный вызов fork”

Когда вы используете fork , ядро ​​создает новый процесс, который является копией процесса forking, и оба процесса продолжают выполняться после fork (с кодом возврата, показывающим, произошла ли ошибка, и является ли исполняемый код родительским или дочерним) , Эта часть «продолжить выполнение» не обязательно происходит сразу: ядро ​​просто добавляет новый процесс в очередь выполнения, и в конечном итоге он будет запланирован и запущен, но не обязательно сразу.

Это объясняет поведение, о котором вы спрашиваете:

  • поскольку новые процессы не обязательно запланированы немедленно, родитель может продолжать работать до того, как у любого ребенка появится шанс на запуск;
  • порядок создания не имеет большого (если есть) эффекта в очереди выполнения, поэтому нет гарантии, что дочерние процессы будут выполняться в том порядке, в котором они созданы.
  • Вилка бомба на Mac?
  • Неожиданный родительский идентификатор процесса на выходе
  • Смущенный этим сценарием с вилкой бомбы
  • Почему эти бомбы вилки-ракеты работают по-разному, и каково значение & в ней?
  • Могу ли я подключать любые два процесса друг к другу?
  • : () {: |: &} ;: Как эта бета-версия BASH работает подробно?
  • Родительский процесс всегда печатает выходные данные после
  • Программный срыв у пользователя, но выполняется под root
  • Apache не может разблокировать: не может выделить память
  • Когда именно context_switch () переключает управление на новый процесс?
  • Почему следующая команда убивает систему?
  • Interesting Posts

    Проблема с fstab mount

    Может кто-то указать мне на gentoo для powermac g5 quad?

    Vim Error 'E212: невозможно открыть файл для записи' при попытке создания новых файлов вне домашнего каталога

    запускать скрипт в нескольких папках параллельно

    Grub не показывает окна после установки crunchbang

    жесткий диск не распознается / файловая система слишком велика, чтобы безопасно монтироваться в этой системе / hdparm показывает мусор

    Заменить часть имени файла по имени каталога

    Занятое устройство на Umount

    Странное форматирование даты в сценарии bash

    Как часто вызывается fsync в повседневном использовании?

    Необычное поведение переменной в циклах while while

    Как установить PHP 5.2.4 в выпуске CentOS 6.5 (Final)?

    терминал предупреждает о закрытии при открытии в скрипте

    Как передать содержимое видеофайла в сеть с помощью h264 over rtp? Командные команды cmd

    zip для использования имени файла

    Linux и Unix - лучшая ОС в мире.