位支持的问题。 为此道歉。 我有一个与GNU readline链接的应用程序。 应用程序可以调用shell命令(类似于使用readline包装器调用tclsh)。 当我尝试调用Linux less命令时,出现以下错误:Suspend(tty output)
我不是terminal问题的专家。 我试图谷歌,但没有find答案。 有谁知道如何解决这个问题?
谢谢。
虽然可能违反直觉,但可能会停止等待输入(某些操作系统和shell会在您可能希望引用(tty输入)时给出Stopped / Suspended(tty输出))。 这将适合通常的行为,当它停止在(它认为是)屏幕长度的结尾。
你可以用猫或头来代替吗? 或少喂一些投入? 或者查看较少的人/信息页,以查看哪些选项较少可能适合您的要求(如W,Z,F)?
您可能需要研究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库或其他类似库来调整终端状态并运行其他程序的程序来说,这是一个常见的问题。
您的readline应用程序正在使自己成为您的tty的控制应用程序。
当你从应用程序内部调用较少的时候,它也想要控制tty。
如果要在应用程序中调用less来为用户显示文件,则在调用exec之前,您需要将新的fork'd进程设置到它自己的进程组中。
你可以用setsid()来做到这一点。 那么当调用tcsetpgrpp()时,它将不会被SIGTTOU抛入背景。
完成的次数减少后,您还需要使用tcsetpgrp()还原foregroud进程组。