从GNU readline调用更less的应用程序

位支持的问题。 为此道歉。 我有一个与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进程组。