inneska написал:
Что по твоему кривого в коде? Скажи где конкретно кривизна.
дык...
inneska написал:
Главное только понять где и почему надо принудительно сбросить буфер.
дело вот в чём: при запуске двух потоков очень важно проследить, что-бы они не использовали общих ресурсов, а если это необходимо, то нужно как-либо заблокировать этот ресурс. невыполнение этого постого правила ведёт к очень сложно выявляемым багам, вроде твоего. Проблема этого кода вот в чём: тут printf выполняется действительно трижды, однако есть одна тонкость: в первый раз выполняются одновременно две printf. Ну мало того, что саму printf так нельзя использовать, так у вас эта функция ещё и пишет в один и тот-же поток! Не удивительно, что программу начинает жестоко глючить. В данном случае вовсе не нужно сбрасывать буфер, точнее нужно. Одним потоком надо его сбросить, а второй должен ждать этого сброса, что-бы после этого начать запись.
Здесь всё просто, потому глюк простой и воспроизводимый. В реальной жизни это приведёт к совсем плачевным последствиям: твоя программа при тестировании будет вести себя замечательно, однако у пользователя она будет жутко глючить. Писать такой код == плохая идея.
Peter написал:
А вот добиться сброса буфера из потомка мне не удалось.
удалось. только это было незаметно. наверное ваш потомок выполнял сброс чуть позже того, как родительский процесс уже записал туда своё. Повторяю - процессы протекают одновременно.
Hvzh написал:
По мне тут все просто. Потомок наследует все окружение родителя в том числе буфера.
так будет в том случае, если буфера все находятся в стеке. однако для printf ЕМНИП этого никто не гаранирует - буфера вполне могут находится в другой памяти, и потому два процесса будут писать в одно и тоже место. а так, как они работают одновременно, то результат, вообще говоря, будет не определён...