Мучающий меня 10 лет вопрос
Jun. 27th, 2012 09:53 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Люди, а скажите мне - через | (пайп) БИНАРНЫЕ данные проходят?
Особо интересует - на линуксе и на винде. Про первое я знаю, что проходят, т.к. arecord | aplay работает, а вот про второе уже 10 лет мучаюсь, но никак руки не дойдут проверить :)
Особо интересует - на линуксе и на винде. Про первое я знаю, что проходят, т.к. arecord | aplay работает, а вот про второе уже 10 лет мучаюсь, но никак руки не дойдут проверить :)
no subject
Date: 2012-06-27 10:23 am (UTC)и почему падлинуксом я наоборот, крайне рад тому, что по умолчанию всё бинарное, а не ломается в непредсказуемых местах от случайного символа, похожего на EOF в середине файла.
no subject
Date: 2012-06-27 11:47 am (UTC)no subject
Date: 2012-06-27 12:00 pm (UTC)Вот, например, есть у нас "компорт", пришел из него байт. Через 1мс еще байт, потом через 2,4,8,16,32...стопицот итд мс еще по байту. В какой момент будем считать, что поток закончился?
По уму, устройство должно явно сказать, что данных больше нет, а не мешать управляющий канал с каналом данных. Ну или придумать отвратный протокол типа построковой буферизации и конца данных по символу доллар.
no subject
Date: 2012-06-27 12:04 pm (UTC)вот и вы и сформулировали причину, по которой EOF удобен
no subject
Date: 2012-06-27 12:14 pm (UTC)почему два -- а опишите как вы будете передавать тот байт, у которого код совпадает с тем, который мы назначили ЕОФ.
no subject
Date: 2012-06-27 12:19 pm (UTC)Я протестую против того, что в нём не было логики и смысла изначально. В те времена данные в файлы вводились с клавиатуры, а не снимались говнозеркалками. Поэтому такая экзотика как EOF вполне могла решать задачу сигнализирования о конце передаваемого файла.
no subject
Date: 2012-06-27 01:40 pm (UTC)по уму это делается передачей по физическому уровню запрещенного символа, который не конвертируется в канальные символы.
ну или можно in-band в канале, специальной комбинацией, но тогда эскейпинг должен быть предусмотрен.
no subject
Date: 2012-06-27 02:02 pm (UTC)Да, если ставить задачу разработки протокола, позволяющего передавать ЛЮБЫЕ байты, нужно изобретать ухищрения вроде "канал данных/канал контроля", "канальный/транспортный/физический уровень", "протокол с ескейпингом" и пр.
Если же говорить о передаче "обычного текста" (т.е. весьма ограниченного подмножества ASCII), которая в своё время составляла, подозреваю, более 83% всех передач, задача решается на порядок проще - введением управляющих символов.
no subject
Date: 2012-06-27 02:23 pm (UTC)"Такие странные значения" не берутся все же из ниоткуда, а вытекают из устройства кодовой таблицы. Просто кем-то когда-то было принято решение о том, что ничего кроме латинских букв и цифр никому никогда передавать не потребуется - и вот это и есть настоящая кривость, под которую и придумали кодовую таблицу.
Эскейпинг в данном случае делается проще некуда: один, условно говоря, "компаратор" и один триггер, который даже механически реализовать не проблема. Зато потом не нужно было бы изобретать ANSI-эскейпинг, кодировки, line discipline и прочую хрень...
no subject
Date: 2012-06-27 02:35 pm (UTC)это было сделано человечеством, которое сформировало язык естественного общения таким, какой он есть - 26 букв плюс пунктуационные мелочи.
То, что информационная эра вносит в традиции свои правки было осознанно позже.
no subject
Date: 2012-06-27 03:55 pm (UTC)Подозреваю, кстати, что там тоже участвовали адепты мифической "обратной совместимости на бинарном уровне".
no subject
Date: 2012-06-27 12:31 pm (UTC)no subject
Date: 2012-06-27 12:33 pm (UTC)no subject
Date: 2012-06-27 12:42 pm (UTC)no subject
Date: 2012-06-27 12:45 pm (UTC)Ок. Пусть это будет количество байт. Это не означает, что данные закончились. Потоком может быть и консоль, т.е. чел может просто нажимать кнопки медленнее, чем программа их обрабатывает.
Поэтому, пока он не нажмёт ^Z нужно игнорировать нулевое чтение и читать снова.
no subject
Date: 2012-06-27 12:54 pm (UTC)Можно этот режим выключить и читать побайтно, с таймаутами, использовать select/epoll и тому подобное.
no subject
Date: 2012-06-27 12:59 pm (UTC)no subject
Date: 2012-06-27 01:36 pm (UTC)no subject
Date: 2012-06-27 01:34 pm (UTC)no subject
Date: 2012-06-27 12:41 pm (UTC)no subject
Date: 2012-06-27 01:35 pm (UTC)no subject
Date: 2012-06-27 06:23 pm (UTC)no subject
Date: 2012-06-27 06:28 pm (UTC)no subject
Date: 2012-06-27 06:33 pm (UTC)no subject
Date: 2012-06-27 06:41 pm (UTC)no subject
Date: 2012-06-27 06:49 pm (UTC)no subject
Date: 2012-06-27 06:53 pm (UTC)логика ок