Ядро (или другая базовая система) может иметь любое количество уровней буферизации, в зависимости от того, с какого устройства читается, и деталей реализации ядра; в некоторых системах нет буферизации на этом уровне, данные считываются непосредственно в буфер пространства пользователя.
Библиотека stdio выделяет буфер для stdin; Размер зависит от реализации, но вы можете контролировать размер и даже использовать свой собственный буфер с setvbuf. Это также позволяет вам контролировать, полностью ли буферизован ввод / вывод (столько данных считывается в буфер, сколько доступно), буферизуется строка (данные считываются только до новой строки) или небуферизируется. По умолчанию используется линейная буферизация, если система может определить, что вход является терминалом, иначе полностью буферизован.
История похожа на стандартный вывод. По умолчанию stderr небуферизован.