From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Date: Sun, 27 Oct 2002 12:53:50 +0200 From: Valentin Nechayev To: community@altlinux.ru Subject: Re: [Comm] =?koi8-r?B?8M/exc3VIMLVxsXSydrB?= =?koi8-r?B?w8nRIM3FztHF1CDQz9LRxM/LINfZ18/Eyc3ZyCDXIMbByswg09TSz8s/?= Message-ID: <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> Mime-Version: 1.0 Content-Type: text/plain; charset=koi8-r Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <18541747015.20021025212014@fastmail.fm> X-42: On 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 X-Reply-To: netch@netch.kiev.ua List-Unsubscribe: , List-Id: List-Post: List-Help: List-Subscribe: , List-Archive: Archived-At: List-Archive: List-Post: Fri, Oct 25, 2002 at 21:20:14, useperl wrote about "[Comm] Почему буферизация меняет порядок выводимых в файл строк?": > From: Henri Bourbon > Да, в свое время меня очень обескуражил этот эффект. Теперь с этим я > разобрался, непонятно же другое: почему буферизация может поменять > *порядок* выводимых в файл строк. Поясняю: Могут быть и более странные эффекты. Дело в том, что если буфера не сброшены явно, то они сбрасываются при выполнении exit(). А обычно libc построена так, что они сбрасываются в порядке обратном стандартному порядку перечисления, то есть stderr сбрасывается раньше, чем stdout. У Вас слишком простой тест был. Вот более навороченный: $ perl -we 'print "1-STDOUT\n"; warn "2-STDERR\n"; print "1-STDOUT\n"; warn "2-STDERR\n";' 1-STDOUT 2-STDERR 1-STDOUT 2-STDERR $ perl -we 'print "1-STDOUT\n"; warn "2-STDERR\n"; print "1-STDOUT\n"; warn "2-STDERR\n";' 2>&1 | cat 2-STDERR 2-STDERR 1-STDOUT 1-STDOUT Это подтверждает то, что я описал в дополнение к описанному ранее: 1. Из-за того, что не терминал, а пайп - буферизация идет поблочно, а не построчно. 2. Блоки для stdout и stderr разные. 3. Буфер для stderr сбрасывается раньше. А еще веселее получается, если stdout и stderr направлены в один пайп, а вывода по каждому из них больше чем стандартный размер буфера (обычно 4K, AFAIR). Когда буфер сбрасывается не по exit(), строки могут быть разрезаны пополам. На логи make это обычно не влияет потому, что от каждого процесса выдача короткая. Но тоже бывает (если, например, много ошибок и много нормального вывода). /netch