2015-10-08 3 views
3

Это похоже на простой вопрос, но мне очень трудно найти ответ. Я пишу программу на C, где это кажется возможным (хотя и отдаленно) на некоторых системах, поскольку, как представляется, существуют ситуации, когда stdin имеет буфер только 4k.Что произойдет, если stdin заполняется?

Итак, на мой вопрос: существует ли стандартный способ работы ОС с заполнением stdin (т. Е. Стандартом де-факто, требованием posix и т. Д.)? Насколько предсказуемым является результат, если на самом деле существует какой-то стандартный способ справиться с ситуацией?

+1

Просто разъяснение, вы не говорите о стандартном C I/O 'stdin' здесь, правильно? Тогда ответ прост: когда ядро ​​видит, что буфер заполнен, он может просто заблокировать процесс, заполняющий буфер. Обратите внимание, что процесс, заполняющий «входные» буферы, обычно отличается от процесса, который фактически потребляет вход (например, терминальная программа в сравнении с приложением, используя стандартную библиотеку для чтения ввода с указателем 'stdin'' FILE'). –

+3

Я не вижу ситуации, когда это действительно имеет значение. В общем, конец записи (например, через трубу) будет блокировать блок записи и неблокировать записи. Не могли бы вы уточнить * почему * это проблема? Думаю, этого не должно быть. –

+1

@FelixPalmen Ему может быть просто любопытно. Было бы интересно узнать, как ОС справляется с этим, даже если это крайний край. –

ответ

3

У ОС будет буфер, в котором хранится непрочитанный вход stdin. В общем, записи в stdin будут использовать блокирующие вызовы, так что если буфер заполняется, они просто останавливаются до тех пор, пока не будет доступно место, поэтому данные не будут потеряны. Если это нежелательное поведение (вы не хотите блокировать писателя), вам нужно убедиться, что вы вовремя читаете буфер, чтобы он не заполнился.

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