是否可以在C中打开一个带有线程的新Linux终端?

时间:2012-09-26 16:43:34

标签: c linux multithreading terminal pthreads

似乎有很多关于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代码,因此除非可以从C运行该脚本,否则不需要shell脚本。任何帮助甚至其他想法都会受到赞赏。

修改

我知道在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");

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

3 个答案:

答案 0 :(得分:2)

gnome-terminal xterm 允许您在终端打开后运行任意命令。

因此,我建议您编写一个帮助程序,该程序知道如何与主程序通信(通过套接字,命名管道或其他一些IPC机制)。你的线程产生终端程序,传递你的帮助程序,它将在终端内运行并通过上述IPC通道与线程通信。

答案 1 :(得分:1)

图书馆libvte,特别是vte_pty_*功能,可能能够做您想做的事。

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

答案 2 :(得分:0)

据我了解,应用程序必须能够打印到终端 - 但你是否也希望它能从中读取?终端应该由用户控制吗?

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

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