2009-07-06 51 views
4

位支持問題。爲此道歉。 我有一個與GNU readline鏈接的應用程序。應用程序可以調用shell命令(類似於使用readline wrapper調用tclsh)。當我嘗試調用Linux less命令時,出現以下錯誤: 掛起(tty輸出)從GNU readline調用較少的應用程序

我不是終端問題專家。我試圖谷歌它,但沒有找到答案。有誰知道如何解決這個問題?

謝謝。

+0

你怎麼調用它? – hhafez 2009-07-06 11:01:05

回答

1

雖然違反直覺,但可能會停止等待輸入(某些操作系統和shell會在您期望它引用(tty輸入)時給出停止/暫停(tty輸出))。當它停止在屏幕長度(它認爲是)的末尾時,這將適合較少的通常行爲。

你可以用貓或頭來代替嗎?或喂少一些輸入?或者查看較少的人/信息頁,以查看哪些選項較少可能符合您的要求(例如w,z,F)?

0

你的readline應用程序正在使自己成爲你的tty的控制應用程序。
當您從應用程序內部調用較少時,它也想要控制tty。

如果您正試圖在應用程序中調用less以顯示用戶的文件, 您希望在調用exec之前將新的fork'd進程設置到它自己的進程組中。
你可以用setsid()來做到這一點。那麼當少調用tcsetpgrpp()時,它將不會得到 與SIGTTOU投擲到背景。

完成的次數越少,您也需要使用tcsetpgrp()恢復foregroud進程組。

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庫或其他類似庫來調整終端狀態並運行其他程序的程序來說,這是一個常見問題。