位支持問題。爲此道歉。 我有一個與GNU readline鏈接的應用程序。應用程序可以調用shell命令(類似於使用readline wrapper調用tclsh)。當我嘗試調用Linux less命令時,出現以下錯誤: 掛起(tty輸出)從GNU readline調用較少的應用程序
我不是終端問題專家。我試圖谷歌它,但沒有找到答案。有誰知道如何解決這個問題?
謝謝。
位支持問題。爲此道歉。 我有一個與GNU readline鏈接的應用程序。應用程序可以調用shell命令(類似於使用readline wrapper調用tclsh)。當我嘗試調用Linux less命令時,出現以下錯誤: 掛起(tty輸出)從GNU readline調用較少的應用程序
我不是終端問題專家。我試圖谷歌它,但沒有找到答案。有誰知道如何解決這個問題?
謝謝。
雖然違反直覺,但可能會停止等待輸入(某些操作系統和shell會在您期望它引用(tty輸入)時給出停止/暫停(tty輸出))。當它停止在屏幕長度(它認爲是)的末尾時,這將適合較少的通常行爲。
你可以用貓或頭來代替嗎?或喂少一些輸入?或者查看較少的人/信息頁,以查看哪些選項較少可能符合您的要求(例如w,z,F)?
你的readline應用程序正在使自己成爲你的tty的控制應用程序。
當您從應用程序內部調用較少時,它也想要控制tty。
如果您正試圖在應用程序中調用less以顯示用戶的文件, 您希望在調用exec之前將新的fork'd進程設置到它自己的進程組中。
你可以用setsid()來做到這一點。那麼當少調用tcsetpgrpp()時,它將不會得到 與SIGTTOU投擲到背景。
完成的次數越少,您也需要使用tcsetpgrp()恢復foregroud進程組。
你可能需要調查的功能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. Themeta_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 torl_prep_terminal()
.
的less
程序很可能會感到困惑,如果終端已經在由的Readline庫使用的特殊模式,它試圖將終端調整爲等效模式。對於使用curses庫或其他類似庫來調整終端狀態並運行其他程序的程序來說,這是一個常見問題。
你怎麼調用它? – hhafez 2009-07-06 11:01:05