有可能用C语言中的线程打开一个新的Linux终端吗



关于SO似乎有很多问题,但不是我想要的。我想看看是否有办法打开一个新的终端窗口(Linux),使用主程序中的线程/子进程,并让该线程/子过程拥有新窗口。

只是对整个目标的概述:我将有一个主程序,我将启动它,并通过stdin接受输入,如果我选择输入"启动助手",它将生成一个新的终端窗口,它本身可以与用户交互(stdin/stdout)。

所以我想做的是让主程序调用线程,让线程使用/拥有新的终端窗口,然后在线程离开并死亡时关闭该窗口。

我知道这个代码不能正常工作,但从概念上讲,我想要这样的东西:

void * Runit()
{
system("gnome-terminal"); //Would like to get a handle to this window
while(1)
printf("I'm the thread!!!n"); //Would like to get this printed to the new window
}
int main()
{
pthread_t child;
pthread_create(&child, NULL, Runit, NULL);
sleep(10);
return 0; //Would like the child & its window to go away now.
}

这方面的要求很宽松,它不必是可移植的,这只是一个让我的生活更轻松的Linux小工具。它必须是C代码,所以没有shell脚本,除非该脚本可以从C运行。任何帮助甚至其他想法都将不胜感激。

编辑:

我知道在linux中,终端有文件句柄/dev/pts/x,我已经尝试过这样的代码:

system("gnome-terminal");
sleep(2); //let the file handle show up in /dev/pts
fp = fopen("/dev/pts/<new file handler number>");
fprintf(fp, "echo hi");

手柄正确打开,但终端中不显示任何内容。

gnome terminalxterm都允许您在终端打开后运行任意命令。

因此,我建议您编写一个助手程序,该程序知道如何与主程序通信(通过套接字、命名管道或其他IPC机制)。线程生成终端程序,并将其传递给助手程序,助手程序将在终端内运行,并通过前面提到的IPC通道与线程通信。

libvte,特别是vte_pty_*函数,可能能够执行您想要的操作。

你提出这个问题的方式表明,你不了解windows和终端I/O在Linux(或者,实际上,在一般的Unix)下是如何工作的,所以我强烈建议你阅读这些内容。从W.Richard Stevens的书《Unix环境中的高级编程》开始。

据我所知,应用程序必须能够打印到终端中,但您希望它也能从中读取吗?终端应该由用户控制吗?

我会使用终端的文件描述符进行操作,您应该检查终端从哪个文件获得用户输入(可能不是stdin,而是一些/dev/pts?),以及终端将其输出写入哪个文件,您可以捕获它,也可以写入其中,从而使内容显示在终端中。但请注意:1) 终端本身可能会发出shell(bash)——如果你向/dev/pts写入,它会显示在终端中,但不会传递给终端中的bash进程——你不能在这样的temrinal中远程生成命令,2) 我认为/dev/pts/x文件将在终端启动时创建,因此您不能fork+dup+exec并捕获终端输出3) 将在终端中运行的进程也会打印一些输出——它不会从/dev/pts 中读取

也许您需要用C编写应用程序,它将在终端中运行,并且该应用程序将与拥有终端的应用程序通信?

最新更新