«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему простой цикл fork() выдает восемь точек вместо двух?

Почему простой цикл fork() выдает восемь точек вместо двух?

Опубликовано 12 ноября 2024 г.
Просматривать:296

Why does the simple fork() loop produce eight dots instead of two?

Забавный случай неожиданного ветвления в fork()

Рассмотрим следующий фрагмент кода, в котором примитив fork() используется для создания дочерних процессов:

#include 
#include 
#include 

int main(void)
{
    int i;
    for(i = 0; i 

Удивительно, но выполнение этой программы дает восемь выходных точек, что на шесть больше, чем вы могли первоначально ожидать. Почему это происходит?

Раскрытие скрытых процессов

Чтобы разгадать эту тайну, давайте углубимся в работу fork(). fork() создает копию текущего процесса, в результате чего возникают родительский и дочерний процессы.

Изначально существует один процесс, который разделяется на два. Оба этих процесса постепенно выполняют цикл for, каждый раз печатая точку. На второй итерации каждый процесс снова разветвляется, создавая в общей сложности четыре процесса. Эти четыре процесса печатают точку перед завершением.

Буферизованный вывод и отложенное появление

Однако printf() буферизует свой вывод, то есть накапливает несколько отпечатков перед их отправкой. сразу. Когда все четыре процесса печатают свои вторые точки, они помещаются в буфер. Вот здесь и возникает хитрый эффект.

При fork() буферизованные точки наследуются дочерними процессами. Таким образом, когда каждый дочерний процесс завершает работу, в выходном потоке появляется его буферизованная точка. Добавление этих четырех отложенных точек к четырем точкам, напечатанным постепенно, дает неожиданную сумму в восемь.

Избегание буферизованных точек

Чтобы обойти это буферизованное поведение, рекомендуется вызвать fflush(стандартный вывод); после каждого оператора printf(). Это приводит к немедленной отправке вывода, гарантируя отображение ожидаемого количества точек.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3