From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Date: Mon, 28 Oct 2002 05:22:41 +0300 From: Henri Bourbon X-Mailer: The Bat! (v1.60m) Personal X-Priority: 3 (Normal) Message-ID: <70247090406.20021028052241@fastmail.fm> To: Valentin Nechayev Cc: community@altlinux.ru Subject: [comm] Почему буферизация меняет порядок выводимых в файл строк? In-Reply-To: <20021027105349.GA40639@netch.kiev.ua> References: <20021025130958.9BADC2EE5D@mail.off-club.com> <20021025232452.670a4295.sinom@ktk.ru> <20021025194035.401ec5c0.vsu@altlinux.ru> <18541747015.20021025212014@fastmail.fm> <20021027105349.GA40639@netch.kiev.ua> MIME-Version: 1.0 Content-Type: text/plain; charset=koi8-r Content-Transfer-Encoding: 8bit Sender: community-admin@altlinux.ru Errors-To: community-admin@altlinux.ru X-BeenThere: community@altlinux.ru X-Mailman-Version: 2.0.9 Precedence: bulk Reply-To: community@altlinux.ru List-Unsubscribe: , List-Id: List-Post: List-Help: List-Subscribe: , List-Archive: Archived-At: List-Archive: List-Post: On 27 Oct 2002 13:53, Valentin Nechayev wrote: >> Да, в свое время меня очень обескуражил этот эффект. Теперь с этим я >> разобрался, непонятно же другое: почему буферизация может поменять >> *порядок* выводимых в файл строк. Поясняю: > Могут быть и более странные эффекты. > Дело в том, что если буфера не сброшены явно, то они сбрасываются при > выполнении exit(). А обычно libc построена так, что они сбрасываются > в порядке обратном стандартному порядку перечисления, то есть stderr > сбрасывается раньше, чем stdout. [skip] > 1. Из-за того, что не терминал, а пайп - буферизация идет поблочно, а не > построчно. > 2. Блоки для stdout и stderr разные. > 3. Буфер для stderr сбрасывается раньше. > А еще веселее получается, если stdout и stderr направлены в один пайп, > а вывода по каждому из них больше чем стандартный размер буфера (обычно 4K, > AFAIR). Когда буфер сбрасывается не по exit(), строки могут быть разрезаны > пополам. > На логи make это обычно не влияет потому, что от каждого процесса > выдача короткая. Но тоже бывает (если, например, много ошибок и много > нормального вывода). Даже не ожидал получить столь фундаментальный ответ :-) Спасибо большое. /* По правде говоря, я, непрограммист, кое-чего даже недопонял (насчет логов make). Но это, может, просто потому, что сейчас 5 утра... Высплюсь и утром доосмыслю :-) */ -- HB