4

ビットサポートの質問。そのことをお詫びします。GNUreadlineにリンクされたアプリケーションがあります。アプリケーションはシェルコマンドを呼び出すことができます(readlineラッパーを使用してtclshを呼び出すのと同様です)。Linuxのlessコマンドを呼び出そうとすると、次のエラーが発生します。Suspend(tty output)

私は端末の問題に関する専門家ではありません。私はそれをグーグルしようとしましたが、答えが見つかりませんでした。この問題を解決する方法を知っている人はいますか?

ありがとう。

4

3 に答える 3

2

おそらく、機能を調査し、readlineマニュアルに文書化する必要rl_prep_terminal()ありますrl_deprep_terminal()

働き:void rl_prep_terminal(int meta_flag)

Readlineで使用するように端末設定を変更してreadline()、キーボードから一度に1文字を読み取ることができるようにします。Readlineが8ビット入力を読み取る必要がある場合、meta_flag引数はゼロ以外である必要があります。

働き:void rl_deprep_terminal(void)

の効果を元に戻しrl_prep_terminal()、端末を最後に呼び出した前の状態のままにしrl_prep_terminal()ます。

端末がすでにReadlineライブラリで使用される特別なモードにあり、端末を同等のモードに微調整しようとすると、lessプログラムが混乱する可能性があります。これは、cursesライブラリ、またはターミナルステータスを調整し、それを実行する他のプログラムを実行する他の同様のライブラリで動作するプログラムに共通の問題です。

于 2009-07-12T05:34:20.023 に答える
1

直感に反しますが、入力の待機を停止する場合があります(一部のOSおよびシェルは、(tty入力)を参照すると予想される場合にStopped / Suspended(tty出力)を提供します)。これは、画面の長さ(と思われる)の終わりで停止する場合の通常の少ない動作に適合します。

代わりに猫や頭を使うことはできますか?またはいくつかの入力を少なくしますか?または、less man / infoページを見て、要件に合う可能性のあるオプション(w、z、Fなど)を確認しますか?

于 2009-07-06T11:22:51.813 に答える
0

あなたのreadlineアプリケーションは、それ自体をあなたのttyの制御アプリにしています。
アプリケーション内からの呼び出しが少ない場合は、ttyも制御する必要があります。

アプリケーションでlessを呼び出してユーザーのファイルを表示しようとしている場合は、execを呼び出す前に、新しいfork'dプロセスを独自のプロセスグループに設定する必要があります。これは、 setsid()
を使用 して実行できます。次に、tcsetpgrpp()の呼び出しが少なくなると、SIGTTOUを使用してバックグラウンドにスローされません。

終了回数が少ない場合は、 tcsetpgrp()を使用してforegroudプロセスグループも復元する必要があります。

于 2009-07-06T18:42:52.797 に答える