metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2012-06-27 09:53 am

Мучающий меня 10 лет вопрос

Люди, а скажите мне - через | (пайп) БИНАРНЫЕ данные проходят?
Особо интересует - на линуксе и на винде. Про первое я знаю, что проходят, т.к. arecord | aplay работает, а вот про второе уже 10 лет мучаюсь, но никак руки не дойдут проверить :)

[identity profile] devnu11.livejournal.com 2012-06-27 07:00 am (UTC)(link)
как-то так process.a.stdout>---<process.b.stdin как в мастдае - не знаю )
abbra: (Default)

[personal profile] abbra 2012-06-27 07:00 am (UTC)(link)
Глупый вопрос -- глупый ответ: http://msdn.microsoft.com/en-us/library/aa365605.aspx

[identity profile] metaclass.livejournal.com 2012-06-27 07:05 am (UTC)(link)
Это совершенно другое.
Я про перенаправление stdout одного процесса в stdin другого.

[identity profile] gds.livejournal.com 2012-06-27 07:16 am (UTC)(link)
если пишущий поставил дескриптор/хендл в "писать бинарное", а читающий, соответственно, в "читать бинарное", средствами сишного рантайма, то проходят. В остальных случаях бывают казусы. Если интересно конкретное "заклинание" для mingw, смогу посмотреть.
abbra: (Default)

[personal profile] abbra 2012-06-27 07:28 am (UTC)(link)
На самом деле из-за отсутствия единообразия в представлении разных каналов в Windows и возникают такие вопросы. Но ответ там же: http://msdn.microsoft.com/en-us/library/tw4k6df8%28v=vs.80%29.aspx
"_setmode is typically used to modify the default translation mode of stdin and stdout, but you can use it on any file. If you apply _setmode to the file descriptor for a stream, call _setmode before performing any input or output operations on the stream."

[identity profile] nicka-startcev.livejournal.com 2012-06-27 09:43 am (UTC)(link)
изобретателю "текстового [по умолчанию] режима ввода-вывода файлов" надо оторвать яйца через горло и вырезать гладны автогеном через жопу, ибо польза от него мизерная и только в очень экзотических случаях.
Edited 2012-06-27 09:43 (UTC)

[identity profile] trueblacker.livejournal.com 2012-06-27 09:46 am (UTC)(link)
вообще-то среди польз был ещё символ eof, и он был очень удобен в своё время. Теперь конечно легко пенять.

[identity profile] nicka-startcev.livejournal.com 2012-06-27 10:23 am (UTC)(link)
и какая с него была польза? В каких случаях кроме случайного "copy binaryfile con"
и почему падлинуксом я наоборот, крайне рад тому, что по умолчанию всё бинарное, а не ломается в непредсказуемых местах от случайного символа, похожего на EOF в середине файла.

[identity profile] trueblacker.livejournal.com 2012-06-27 11:47 am (UTC)(link)
элементарная польза. Как узнать, что данные в потоке закончились? Это весьма нетривиальный вопрос и его решали в соответствии с реалиями того времени.

[identity profile] nicka-startcev.livejournal.com 2012-06-27 12:00 pm (UTC)(link)
а что значит "в потоке данные закончились"?
Вот, например, есть у нас "компорт", пришел из него байт. Через 1мс еще байт, потом через 2,4,8,16,32...стопицот итд мс еще по байту. В какой момент будем считать, что поток закончился?

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

[identity profile] trueblacker.livejournal.com 2012-06-27 12:04 pm (UTC)(link)
>По уму, устройство должно явно сказать, что данных больше нет

вот и вы и сформулировали причину, по которой EOF удобен

[identity profile] nicka-startcev.livejournal.com 2012-06-27 12:14 pm (UTC)(link)
в байтовом потоке выделить как минимум два байта для служебных целей? Как-то некамильфо.

почему два -- а опишите как вы будете передавать тот байт, у которого код совпадает с тем, который мы назначили ЕОФ.

[identity profile] trueblacker.livejournal.com 2012-06-27 12:19 pm (UTC)(link)
я не собираюсь утверждать, что EOF - это тру и так всем надо делать.
Я протестую против того, что в нём не было логики и смысла изначально. В те времена данные в файлы вводились с клавиатуры, а не снимались говнозеркалками. Поэтому такая экзотика как EOF вполне могла решать задачу сигнализирования о конце передаваемого файла.

[personal profile] ex0_planet 2012-06-27 12:31 pm (UTC)(link)
Вернуть 0 на очередной read?

[identity profile] trueblacker.livejournal.com 2012-06-27 12:33 pm (UTC)(link)
а чем 0 круче EOF'а ?

[identity profile] metaclass.livejournal.com 2012-06-27 12:41 pm (UTC)(link)
Это может быть и ошибка, а не только конец файла :)

[identity profile] metaclass.livejournal.com 2012-06-27 12:42 pm (UTC)(link)
read возвращает число прочитанных байт.

[identity profile] trueblacker.livejournal.com 2012-06-27 12:45 pm (UTC)(link)
"возвращает" - растяжимое понятие. Я задал вопрос для уточнения.
Ок. Пусть это будет количество байт. Это не означает, что данные закончились. Потоком может быть и консоль, т.е. чел может просто нажимать кнопки медленнее, чем программа их обрабатывает.

Поэтому, пока он не нажмёт ^Z нужно игнорировать нулевое чтение и читать снова.

[identity profile] metaclass.livejournal.com 2012-06-27 12:54 pm (UTC)(link)
В консоли обычно ждет Enter а потом возвращает.
Можно этот режим выключить и читать побайтно, с таймаутами, использовать select/epoll и тому подобное.

[identity profile] trueblacker.livejournal.com 2012-06-27 12:59 pm (UTC)(link)
какая разница, какой кнопки ждать? Ну enter... Что это меняет? "Не нажата ни одна клавиша" и "не нажата клавиша enter" всё равно не "данные закончились".

[personal profile] ex0_planet 2012-06-27 01:34 pm (UTC)(link)
тем что не в потоке, а out-of-band

[personal profile] ex0_planet 2012-06-27 01:35 pm (UTC)(link)
это исключительная ситуация, а уж что там за - пусть разбирается отдельная функция

[personal profile] ex0_planet 2012-06-27 01:36 pm (UTC)(link)
консоль тупо блокируется, пока не будет достаточно данных. достаточно - понятие растяжимое.

[personal profile] ex0_planet 2012-06-27 01:40 pm (UTC)(link)
вы путаете уровни
по уму это делается передачей по физическому уровню запрещенного символа, который не конвертируется в канальные символы.
ну или можно in-band в канале, специальной комбинацией, но тогда эскейпинг должен быть предусмотрен.

[identity profile] trueblacker.livejournal.com 2012-06-27 02:02 pm (UTC)(link)
это вы, а не я путаете уровни. Вы рассуждаете о современной проблематике, а я вам говорю о решении, которое было выработано в гораздо более тепличных условиях и которое опиралось на то, что "кому потребуется передавать такие странные значения?".

Да, если ставить задачу разработки протокола, позволяющего передавать ЛЮБЫЕ байты, нужно изобретать ухищрения вроде "канал данных/канал контроля", "канальный/транспортный/физический уровень", "протокол с ескейпингом" и пр.

Если же говорить о передаче "обычного текста" (т.е. весьма ограниченного подмножества ASCII), которая в своё время составляла, подозреваю, более 83% всех передач, задача решается на порядок проще - введением управляющих символов.

[personal profile] ex0_planet 2012-06-27 02:23 pm (UTC)(link)
В общем, телефонисты (точнее телеграфисты) как всегда во всем виноваты. У них цеховая традиция - делать решения феерической кривожопости, с которыми остальным сорок лет приходится как-то мириться.

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

Эскейпинг в данном случае делается проще некуда: один, условно говоря, "компаратор" и один триггер, который даже механически реализовать не проблема. Зато потом не нужно было бы изобретать ANSI-эскейпинг, кодировки, line discipline и прочую хрень...

[identity profile] trueblacker.livejournal.com 2012-06-27 02:35 pm (UTC)(link)
>Просто кем-то когда-то было принято решение о том, что ничего кроме латинских букв и цифр никому никогда передавать не потребуется

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

То, что информационная эра вносит в традиции свои правки было осознанно позже.

[personal profile] ex0_planet 2012-06-27 03:55 pm (UTC)(link)
Как бе о том, что текст - это не просто последовательность буков было известно сильно заранее. Просто в то, чем можно было пользоваться исключительно для телеграфа, попытались запихнуть элементы верстки, управления линком и черт знает что еще, вместо того чтобы сесть и сделать по нормальному.

Подозреваю, кстати, что там тоже участвовали адепты мифической "обратной совместимости на бинарном уровне".

[identity profile] theiced.livejournal.com 2012-06-27 06:23 pm (UTC)(link)
ты тупое говно. в юниксах как то обходились прекрасно.

[identity profile] trueblacker.livejournal.com 2012-06-27 06:28 pm (UTC)(link)
браузер на руби написал уже, говножорка?

[identity profile] theiced.livejournal.com 2012-06-27 06:33 pm (UTC)(link)
яркий пример змагарской недологики.

[identity profile] trueblacker.livejournal.com 2012-06-27 06:41 pm (UTC)(link)
не хватало ещё, чтобы ты мне тут про логику задвигал. Нахуй дорогу найдёшь?

[identity profile] theiced.livejournal.com 2012-06-27 06:49 pm (UTC)(link)
действительно, ты слишком туп что бы осознать что такое причнно следственные связи. сосни хуйца.

[identity profile] trueblacker.livejournal.com 2012-06-27 06:53 pm (UTC)(link)
жена уже не удовлетворяет и ты решил предлагать своего мальнкого айседа блогерам?
логика ок

[identity profile] freiksenet.livejournal.com 2012-06-28 07:32 am (UTC)(link)
А какие еще данные бывают кроме бинарных %)

[identity profile] metaclass.livejournal.com 2012-06-28 07:33 am (UTC)(link)
32..127

[identity profile] freiksenet.livejournal.com 2012-06-28 07:35 am (UTC)(link)
зачем...

[identity profile] fraks-nsk.livejournal.com 2012-06-29 04:41 pm (UTC)(link)
Я в курсе что gbak.exe умеет получать и принимать данные через stdin/stdout заместо указания файлов. Значица и на винде бинарные данные проходят.