вызов меньшего количества приложений из строки чтения GNU

Бит поддержки вопрос. Извинения за это. У меня есть приложение, связанное с GNU readline. Приложение может вызывать команды оболочки (аналогично вызову tclsh с помощью оболочки readline). Когда я пытаюсь вызвать команду Linux less, я получаю следующую ошибку: Suspend (tty output)

Я не эксперт в вопросах терминалов. Я пытался погуглить, но не нашел ответа. Кто-нибудь знает, как решить эту проблему?

Спасибо.


person eran    schedule 06.07.2009    source источник
comment
как ты его вызываешь?   -  person hhafez    schedule 06.07.2009
comment
readline и less являются командами обработки ввода. Как вы их подключаете?   -  person nik    schedule 06.07.2009


Ответы (3)


Хотя это нелогично, он может быть остановлен в ожидании ввода (некоторые ОС и оболочки выдают Stopped/Suspended (вывод tty), когда вы ожидаете, что он будет ссылаться на (ввод tty)). Это соответствует обычному поведению less, когда он останавливается в конце (как он думает) длины экрана.

Можете ли вы вместо этого использовать кошку или голову? или кормить меньше входных данных? или посмотрите на страницах less man/info, чтобы узнать, какие варианты less могут удовлетворить ваши требования (например, w, z, F)?

person mas    schedule 06.07.2009

Вероятно, вам нужно изучить функции rl_prep_terminal() и rl_deprep_terminal(), описанные в строке чтения. руководство:

Функция: void rl_prep_terminal(int meta_flag)

Измените настройки терминала для использования Readline, чтобы readline() мог считывать с клавиатуры по одному символу за раз. Аргумент meta_flag должен быть ненулевым, если Readline должен считывать восьмибитный ввод.

Функция: void rl_deprep_terminal(void)

Отмените действие rl_prep_terminal(), оставив терминал в том состоянии, в котором он был до самого последнего вызова rl_prep_terminal().

Программа less может запутаться, если терминал уже находится в специальном режиме, используемом библиотекой Readline, и пытается настроить терминал в эквивалентном режиме. Это обычная проблема для программ, которые работают с библиотекой curses или другими подобными библиотеками, которые настраивают состояние терминала и запускают другие программы, которые также делают это.

person Jonathan Leffler    schedule 12.07.2009

Ваше приложение readline делает себя управляющим приложением для вашего tty.
Когда вы вызываете less из приложения, оно также хочет контролировать tty.

Если вы пытаетесь вызвать less в своем приложении, чтобы отобразить файл для пользователя, вы хотите установить новый разветвленный процесс в его собственную группу процессов перед вызовом exec.
Вы можете сделать это с помощью setsid( ). Затем, когда less вызовет tcsetpgrpp(), он не будет брошен в фоновый режим с помощью SIGTTOU.

Когда less завершится, вы также захотите восстановить группу процессов переднего плана с помощью tcsetpgrp().

person codeDr    schedule 06.07.2009