如何在 C 中将 printf 重定向到新的 Konsole 窗口?

How do I redirect printf to new Konsole window in C?

提问人:Green_Dad 提问时间:11/16/2023 更新时间:11/17/2023 访问量:51

问:

我有程序,它使用线程分别运行 2 个函数。我希望 func1 的输出位于我启动程序的控制台窗口中,并且 func2 的输出位于新创建的窗口中。对此有什么建议的解决方案吗?

我使用 system(“konsole”);在 func2 中创建新的控制台,但它只是在第一个窗口中冻结输出(我的意思是程序正在运行,但输出被冻结,直到我关闭新的控制台窗口)。

C Linux Konsole

评论

1赞 Some programmer dude 11/16/2023
该功能被阻止。在运行的命令完成之前,它不会返回。考虑到你想专门使用 Konsole,我假设你使用的是 KDE 系统?我确信 KDE 框架有某种方法可以打开控制台窗口并为您提供输出到它的方法。system
0赞 mousetail 11/16/2023
有没有办法从运行程序开始?如果可以(以非阻塞的方式,而不是)使用您控制的程序创建控制台,则该程序可以中继输出。您可以通过网络或通过文件或 unix 套接字进行通信。konsolesystem()
0赞 Allan Wind 11/16/2023
你可能要研究什么popen()

答:

1赞 n. m. could be an AI 11/16/2023 #1

这对我有用(在默认挂载的 Linux 上;其他操作系统或未挂载 /proc 的 Linux 将不起作用)。/proc

  #define KONSOLE_BUFSIZE 512
  char buf[KONSOLE_BUFSIZE];
  FILE* p = popen("konsole -e 'sh -c \"cat /proc/$PPID/fd/0\"'", "w");
  if (p == NULL ) { /* process error */ }
  setvbuf(p, buf, _IOLBF, KONSOLE_BUFSIZE);

  ...

  pclose(p);

写入以显示在 konsole 窗口中。我们依赖于 shell 的父进程是终端仿真器本身这一事实,并窃取其标准输入。p

一种更POSIX-y的方法是设置一个命名管道,并让程序写入它,而在生成的终端仿真器中,它正在读取它。cat

0赞 Armali 11/17/2023 #2

对 n. m. 的小简化可能是 AI 的好答案:

    FILE *p = popen("konsole -e cat /proc/$$/fd/0", "w");
    …
    setlinebuf(p);

此外,可能值得注意的是,原因和终止;如果想要等待控制台窗口关闭,可以在没有生成其他子窗口之前使用。pclosecatkonsolewait(NULL)