从GNU readline调用较少的应用程序

时间:2009-07-06 10:56:44

标签: linux readline

比特支持问题。为此道歉。 我有一个与GNU readline链接的应用程序。应用程序可以调用shell命令(类似于使用readline包装器调用tclsh)。当我尝试调用Linux less命令时,出现以下错误: 暂停(tty输出)

我不是终端问题的专家。我试图谷歌但没有找到答案。有谁知道如何解决这个问题?

感谢。

3 个答案:

答案 0 :(得分:2)

您可能需要调查readline手册中记录的函数rl_prep_terminal()rl_deprep_terminal()

  

功能:void rl_prep_terminal(int meta_flag)

     

修改Readline使用的终端设置,因此readline()可以从键盘一次读取一个字符。如果Readline应读取8位输入,则meta_flag参数应为非零。

     

功能:void rl_deprep_terminal(void)

     

撤消rl_prep_terminal()的效果,使终端处于最近一次呼叫rl_prep_terminal()之前的状态。

如果终端已经处于Readline库使用的特殊模式并且它试图将终端调整为等效模式,则less程序可能会混淆。对于与curses库或其他类似库一起使用的程序来说,这是一个常见的问题,这些库可以调整终端状态并运行其他程序。

答案 1 :(得分:1)

虽然违反直觉,但可能会停止等待输入(某些操作系统和shell会在您希望它引用(tty输入)时给出Stopped / Suspended(tty输出))。当它在屏幕长度结束时(它认为是什么)停止时,这将适合通常较少的行为。

你可以用猫或头吗?或者减少一些投入?或者查看较少的人/信息页面,看看哪些选项可以满足您的要求(例如w,z,F)?

答案 2 :(得分:0)

您的readline应用程序正在使自己成为您的tty的控制应用程序 当你从应用程序内部调用less时,它也希望控制tty。

如果您尝试在应用程序中调用较少的内容来为用户显示文件, 你想在调用exec之前将新的fork进程设置到它自己的进程组中 您可以使用 setsid()执行此操作。然后当少调用tcsetpgrpp()时,它就不会得到 用SIGTTOU投入到背景中。

如果完成时间较少,您还需要使用 tcsetpgrp()恢复foregroud进程组。