Вы не можете точно определить, какой процесс будет выполнен первым.Как и HackerBoss заявил, что printf
также может влиять на этот порядок.
Представьте, что ваш основной программный pid (3124
) генерирует дочерний элемент 3125
.После рождения ребенка от отца и ребенка должны быть вызваны следующие инструкции:
printf("2.fork() from ");
На этом этапе есть два направления:
- Фатер
3124
вызывает printf
- Child
3125
вызывает printf
Поскольку printf
требует I/O scheduling
, это зависит от process priority
и resource state
(тамэто может быть другой процесс, уже использующий ресурс, что делает его busy resource
).
Таким образом, похоже, что в вашей программе отец 3124
сначала получает доступ к ресурсу и продолжает выполнение до следующего форка, где рождается ребенок 3126
.
На этом этапе возникает один и тот же вопрос: в каком направлении мне идти?Следующая инструкция:
printf("3.fork() from ");
Направления:
- Fater
3124
вызывает printf
- Child
3126
вызывает printf
Из вашей программы похоже, что первый процесс, который вызывает ее, является дочерним 3126
.
Так что на самом деле printf
не гарантирует вам порядок генерации процесса.Поскольку прозрачно, как работает I/O scheduling
, лучшим способом было бы сохранить значение в конкретном адресе, отличном для каждого процесса, заключив fork
в оператор if
:
pid=fork();
if (pid == 0) {
//child process
} else {
//father process
}
Таким образом, вы сможете лучше понять, что делает process scheduler
, поскольку на самом деле это может быть process scheduler
, который запускает дочерний элемент перед другим, существует множество алгоритмов планирования.На этом этапе OS
, который вы используете, также влияет на порядок выполнения процесса, в зависимости от используемого алгоритма.