В Unix, будь то на системной консоли или в окне терминала X, клавиатурный ввод / вывод проходит через виртуальный терминал. Устройство / dev / tty в наши дни является обычным способом доступа к управляющему терминалу процесса. Все манипуляции с устройством, кроме открытия / закрытия / чтения / записи, обрабатываются системным вызовом ioctl (2) для этого конкретного устройства. Общая идея того, что вы хотите сделать, это
Открыть управляющий терминал (который может быть или не быть стандартным)
Измените режим работы на этом терминале, чтобы он возвращался без ожидания полной строки ввода (что является нормальным значением по умолчанию)
Продолжайте работу с остальной частью вашей программы, зная, что чтение с этого терминала (которое может быть стандартным) может возвращать частичные строки или даже нулевые символы, не будучи ошибкой или условием завершения.
Подробный ответ о том, как выполнить второй шаг, можно найти в FAQ по C-программированию . Они также указывают, что это вопрос ОС, а не вопрос языка. Они предоставляют девять возможностей, но три основных, имеющих отношение к этому вопросу:
- Используйте библиотеку curses (3)
- Старые системы в стиле BSD, используйте sgttyb для установки CBREAK или RAW
- Posix или старые системы в стиле System V, используйте TCGETAW / TCSETAW для установки c_cc [VMIN] в 1 и c_cc [VTIME] в 0.
Следование нескольким ссылкам в C FAQ может привести к этой странице фрагментов кода kbhit .