7

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

只是对完整目标的概述:我将有一个主程序,我将启动stdin它并通过用户(标准输入/标准输出)。

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

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

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");

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

4

3 回答 3

2

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

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

于 2012-09-26T16:56:33.793 回答
1

libvte,特别是vte_pty_*函数,可能能够做你想做的事。

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

于 2012-09-26T16:53:31.307 回答
0

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

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

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

于 2012-09-26T17:02:46.833 回答