2009-07-06 1 views
4

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

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

Спасибо.

+0

как вы его вызываете? – hhafez

+0

readline и меньше являются командами обработки ввода. Как вы их связываете? – nik

ответ

1

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

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

0

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

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

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

2

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

Function: void rl_prep_terminal(int meta_flag)

Modify the terminal settings for Readline's use, so readline() can read a single character at a time from the keyboard. The meta_flag argument should be non-zero if Readline should read eight-bit input.

Function: void rl_deprep_terminal(void)

Undo the effects of rl_prep_terminal() , leaving the terminal in the state in which it was before the most recent call to rl_prep_terminal() .

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

 Смежные вопросы

  • Нет связанных вопросов^_^