比特支持问题。为此道歉。 我有一个与GNU readline链接的应用程序。应用程序可以调用shell命令(类似于使用readline包装器调用tclsh)。当我尝试调用Linux less命令时,出现以下错误: 暂停(tty输出)
我不是终端问题的专家。我试图谷歌但没有找到答案。有谁知道如何解决这个问题?
感谢。
答案 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进程组。