位支持问题。对此表示歉意。我有一个与 GNU readline 链接的应用程序。应用程序可以调用 shell 命令(类似于使用 readline 包装器调用 tclsh)。当我尝试调用 Linux less 命令时,出现以下错误:Suspend (tty output)
我不是终端问题的专家。我试过用谷歌搜索,但没有找到答案。有谁知道如何解决这个问题?
谢谢。
您可能需要调查功能rl_prep_terminal()
并rl_deprep_terminal()
记录在readline手册中:
功能:
void rl_prep_terminal(int meta_flag)
修改 Readline 使用的终端设置,因此
readline()
可以从键盘一次读取一个字符。如果 Readline 应读取 8 位输入,则该meta_flag
参数应为非零。功能:
void rl_deprep_terminal(void)
撤消 的效果
rl_prep_terminal()
,使终端保持最近一次调用 之前的状态rl_prep_terminal()
。
less
如果终端已经处于 Readline 库使用的特殊模式并且它试图将终端调整为等效模式,则程序可能会感到困惑。对于使用 curses 库或其他类似的库来调整终端状态并运行其他同样执行此操作的程序的程序,这是一个常见问题。
虽然违反直觉,但它可能会停止等待输入(当您可能期望它引用(tty 输入)时,某些操作系统和 shell 会给出 Stopped/Suspended(tty 输出))。当它在屏幕长度结束时(它认为是)停止时,这将符合 less 的通常行为。
你可以用 cat 或 head 代替吗?或者少喂一些输入?或查看 less 手册/信息页面以查看 less 的哪些选项可能适合您的要求(例如 w、z、F)?
您的 readline 应用程序正在使自己成为您的 tty 的控制应用程序。
当您从应用程序内部调用 less 时,它也希望控制 tty。
如果您尝试在应用程序中调用 less 来为用户显示文件,您希望在调用 exec 之前将新的 fork 进程设置到它自己的进程组中。
您可以使用setsid()执行此操作。那么当 less 调用 tcsetpgrpp() 时,它不会被 SIGTTOU 扔到背景中。
当 less 完成时,您还需要使用tcsetpgrp()恢复前台进程组。