Вопрос был обновлен: «Программа должна работать в фоновом режиме ... но командная строка не GUI».
Все традиционное; * Оболочки NIX, которые могут перевести программу в фоновый режим, также отключают стандартный ввод программы от терминала, так что, AFAIK, это стало невозможным.
Это не обязательно для Mac. Mac поддерживает * NIX механизмы для чтения символов с клавиатуры.
AFAICT все, что делает программа, ждет символа, так что она может также блокироваться.
Обычно терминальное устройство tty (телетайп!) Интерпретирует символы, набранные на клавиатуре, прежде чем ваша программа сможет прочитать их со стандартного ввода. В частности, устройство tty обычно буферизует всю строку текста и перехватывает символ удаления (и некоторые другие, такие как CTRL + w), чтобы редактировать строку текста. Эта предварительная обработка символов называется «дисциплиной линии»
Вам нужно установить драйвер устройства tty, чтобы прекратить это делать! Затем вы можете получить все символы, которые вводит пользователь.
Вы меняете устройство, используя ioctl или termios в файловом дескрипторе.
Поиск, например, "ioctl tty line дисциплина raw", чтобы понять детали и найти примеры программ.
Вы можете установить терминал в «raw», используя программу командной строки stty
.
Пожалуйста, прочитайте man-страницу stty, потому что ее установка может быть немного хитрой (NB: если вы допустили ошибку, часто проще убить терминал, чем пытаться исправить это, потому что нет ничего, что вы вводите)
Возможно, что стрелка вверх не является одиночным символом, поэтому потребуется некоторое побайтное декодирование, чтобы избежать блокировки в неправильной точке входного потока, т.е. если некоторые входные последовательности представляют собой один символ и другие два или три символа, декодирование должно происходить в каждом байте, чтобы решить, есть ли ожидающий байт, или может быть выдано слишком много чтения, что приведет к блокировке программы.