【问题标题】:Multiple xterm pseudoterminals used as output only from multiple threads多个 xterm 伪终端仅用作多个线程的输出
【发布时间】:2023-03-07 22:44:09
【问题描述】:

我一直在努力从我的程序中启动几个线程,我希望它们每个都输出到各自的终端窗口(我以平铺模式弹出)。

它们不是外壳,只是用于输出的终端窗口。

我正在用 C 语言在 ubuntu 上进行编码。我可以让它工作,但由于某种原因,几分钟后 xterm 显示缓冲区就好像填满了(彼此独立)并且它们停止显示新文本。旧文本仍然存在,线程继续在后台执行其操作,但没有新的输出。

我已经尝试了所有我能找到的东西,但仍然感到困惑。

我似乎找不到可能的:

  • 我需要刷新或清除缓冲区
  • 一种清除屏幕的方法(即使在我重定向输入或尝试将它们作为输出发送到 xterm 之后,那些 VT 转义码也没有任何作用)
  • 一种将光标重新定位在终端窗口左上角的方法
  • 一种重置文件描述符的方法,我已经指向了相应的 /dev/pts

这是现在的情况(也请随时指出我正在做的任何多余或错误的事情;注意,在这种情况下,可移植性并不是很重要)。我省略了错误检查。我希望我不必使用 system() 但这是我可以让它工作的唯一方法(posix_spawn 也没有工作)。此代码在每个线程中运行(平铺效果未显示,但通过共享内存和 xterm 命令行上的一些附加参数进行管理):

char buf_xt[256]; // Used along with sprinf() and write() to output to xterm
char *pSptyName;
int xterm_fd1; // File descriptor for xterm

xterm_fd1 = posix_openpt(O_RDWR | O_NONBLOCK | O_NOCTTY);

pSptyName = ptsname(xterm_fd1);
sprintf(buf_xt, "xterm -S%s/%d &", pSptyName, xterm_fd1);
system(buf_xt);

我像这样输出到 xterm:

sprintf(buf_xt, “Writing to xterm.\n”);
write(xterm_fd1, buf_xt, strlen(buf_xt));

我希望 curses 中的 newterm() 可以解决问题(也可以接受其他想法),但我在任何地方都找不到任何有用的文献或示例,所以我希望这里有人可以提供一些真实的RTFM 以外的信息(我已经有了,但具体的实现将有助于填补文档中的空白)。

作为旁注,当我关闭程序时,我无法单独关闭 xterm 实例。我必须再给killall xterm 打一个system() 电话,所以对此的任何想法也将不胜感激。

谢谢

【问题讨论】:

  • 这很难调试...一个猜测:你是否有可能输出一个控制序列,如 XOFF (ctrl+s)、转义序列或类似的?您可以尝试仅过滤可打印字符的输出吗?
  • 感谢您的回复。我输出的东西是非常简单的文本,比如"|---Connecting\n" "|-Talking...\n" 这是我编码的输出,不是未知的东西......还有其他想法吗?我研究了这个 [链接] (linusakesson.net/programming/tty),这让我大吃一惊,但我不知道如何清除他们所说的内核缓冲区“伪终端只能在其内核缓冲区中保留一定数量的数据,当缓冲区已满时 [...]"
  • 你能在一个挂起的 xterm 进程上运行 strace 看看它在做什么吗?
  • hmmmm 你知道怎么做吗,因为我是从 system() 调用运行它并且只是将 pts 位置作为命令行参数传递?
  • 使用ps afx 或类似方法获取pid 并执行strace -p <pid>

标签: c io io-redirection xterm


【解决方案1】:

在 ncurses 源中,ditto 程序 (test/ditto.c) 可以编译成多个 xterm,例如,将其运行为

ditto first second

使用这些标题创建两个 xterm(除了您开始的屏幕)。

使用newterm。为此,您必须使用 --with-pthread 选项配置 ncurses。这并不能解决关闭 xterms 的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    相关资源
    最近更新 更多