LINUX.ORG.RU

гарантирует ли позикс реальную потоковость потоковых утилит?


0

0

есть потоковые утилиты -- типа awk -- которые на каждую входную строку могут генерировать выходную.

Есть ли гарантия в стандарте, что если я создам процесс, скажем awk '{ print }' и прилеплю ему на вход/выход пайпы, то если я кину на вход строку (не закрывая пайп), то я получу строку на выходе -- то есть не будет происходить никакой буферизации в пределах нескольких строк??

★★★★★

судя по наличию в gawk функции fflush - нет, не гарантирует, но позволяет организовать. Копаться в SUS/POSIX лень.

anonymous
()

Ничего не гарантируется. У некоторых утилит описаны специальные флаги, которые гарантированно отключают буферизацию вывода.

execve
()
Ответ на: комментарий от execve

>Ничего не гарантируется. У некоторых утилит описаны специальные флаги, которые гарантированно отключают буферизацию вывода.

ключевое слово "некоторых"

мне скажем заметно усложняет жизнь отсутствие такого флага в iconv

cvv ★★★★★
()
Ответ на: комментарий от cvv

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

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

Но есть awk, в котором хэш есть, поэтому очевидно решение -- повесить на пайпах процесс awk, и фунции store/load хэша будут обмениваться сообщениями с ним -- и он будет обеспечивать хэш. Это позволяет фактически иметь builtin hash, но не использовать башизмов.

Но так как awk может буферизовать, то это обламывается..

dilmah ★★★★★
() автор топика
Ответ на: комментарий от dilmah

Вообще, традиционно, все такого рода утилиты используют C-шный stdio для вывода. Поэтому политика буферизации у них тоже традиционная - строчная, если isatty(fileno(stdout)), иначе блочная.

anonymous
()
Ответ на: комментарий от dilmah

Как уже сказали, у awk (точнее у gawk) есть функция fflush. Поэтому если awk получает строку, то можно в случае gawk добиться, что написанная им строка уйдет в pipe гарантированно.

Хотя, имхо, уже лучше использовать башизмы, чем завязываться на gawk...

mky ★★★★★
()
Ответ на: комментарий от mky

> Как уже сказали, у awk (точнее у gawk) есть функция fflush. Поэтому если awk получает строку, то можно в случае gawk добиться, что написанная им строка уйдет в pipe

обычный awk умеет закрывать дескрипторы -- так что можно эмулировать fflush через close

dilmah ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.