Забавный случай неожиданного ветвления в 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