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

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

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

[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 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)
Как бе о том, что текст - это не просто последовательность буков было известно сильно заранее. Просто в то, чем можно было пользоваться исключительно для телеграфа, попытались запихнуть элементы верстки, управления линком и черт знает что еще, вместо того чтобы сесть и сделать по нормальному.

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

[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: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:36 pm (UTC)(link)
консоль тупо блокируется, пока не будет достаточно данных. достаточно - понятие растяжимое.

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

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

[personal profile] ex0_planet 2012-06-27 01:35 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)
жена уже не удовлетворяет и ты решил предлагать своего мальнкого айседа блогерам?
логика ок