【发布时间】:2012-09-18 08:41:30
【问题描述】:
似乎有很多关于 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");
句柄正确打开,但终端没有显示任何内容。
【问题讨论】:
-
这个窗口应该运行一个shell吗?还是仅用于用户输入?
-
@parsifal - 只是 I/O(Ascii 菜单和响应),我不需要在新窗口中编写任何花哨的 shell 脚本
-
这是经典的
fork()、execv()、wait()的东西。线程是不必要的。 -
@Dave - 除非我弄错了,否则不会这样做。我希望能够控制(即终止)生成的进程。工作线程或子线程将永远运行(打印/获取输入循环),所以我想从主线程中杀死它们。
-
您显示的代码应该可以工作;我怀疑你正在犯 I/O 缓冲。请改用
open和write。也可以试试gnome-terminal -e 'sleep 36000'。
标签: c linux multithreading terminal pthreads