似乎有很多关于这个接近的问题,但不是我所期待的。 我试图看看是否有办法打开一个新的terminal窗口(Linux),从我的主程序的线程/subprocess,并让该线程/subprocess拥有新的窗口。
只是一个完整的目标的概述:我将有一个主要的程序,我将启动,并将采取通过stdin
,如果我selectinput“启动助手”,它会产生一个新的terminal窗口,本身可以互动用户(stdin / stdout)。
所以我想要做的就是让主程序调用线程,让线程使用/拥有新的terminal窗口,然后当线程消失并死亡时,将该窗口closures。
我知道这个代码不能正常工作,但从概念上来说,我想要这样的东西:
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运行。任何帮助,甚至其他想法,赞赏。
编辑:
我知道,在Linuxterminal有文件句柄/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");
手柄可以正确打开,但terminal上不显示任何内容。
终端打开后, gnome-terminal和xterm都可以运行任意命令。
因此,我建议你编写一个帮助程序,知道如何与主程序进行通信(通过套接字,命名管道或其他IPC机制)。 你的线程产生终端程序,传递你的帮助程序,它将在终端内运行,并通过上述IPC通道与线程通信。
库libvte
,特别是vte_pty_*
函数, 可以做你想做的事情。
你说这个问题的方式表明你不明白Linux和终端I / O是如何在Linux下工作的,所以我强烈建议你阅读这些内容。 从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编写应用程序,它只会在终端中运行,而应用程序将与你拥有终端的应用程序进行通信?