2011-12-22 71 views
0

我想出了这样的事情..更改控制终端

int main (unsigned argc, char **argv) 
{ 
    printf("***this is the original terminal window!!!***\n"); 
    if(!fork()){//child 
     system("gnome-terminal -e ./client"); 
    } 
    else{   
     printf("this is the parent, printing in the original terminal window\n"); 
    } 
} 

它打开其中执行./client一个新的终端窗口。唯一的问题是在./client事情结束后新的终端窗口会自动关闭。如何在不使用./client上的for(;;)做一些愚蠢的事情的情况下修复此问题?此外,这种方法整体小于最佳的解决方案......

我真的想什么,能够做的是:

int main (unsigned argc, char **argv) 
{ 
    printf("***this is a generator!!!***\n"); 
    if(!fork()){//child 
     system("gnome-terminal or wathever"); //the solution must be here right?? 
     printf("this get's printed on the new window and whatever i do on the\ 
       child process get's done there too") 
     //and the window won't close automatically 
    } 
    else{   
     printf("this is the parent, printing in the original terminal window\n"); 
    } 
} 

这将是更加灵活,我只是不喜欢不必exec()从另一个文件...

我使用Ubuntu 11.10和语言是C

+0

至于第一部分:你总是可以只放在客户端(例如,'客户端;读取foo')之后暂停以保持终端打开。至于推出一个终端,并获得其“pty”......我不知道。 – BRFennPocock 2011-12-22 19:59:42

回答

0

我想你应该使用其父断开孩子3210。

From Wiki

系统调用setpgid()是用来设置进程组的过程的ID,从而无论是在加入过程到现有的处理组,或的会话中创建新的进程组过程成为新创建的组的过程组组长。 POSIX禁止在具有该标识符的进程组仍然存在的情况下(即进程组的引导者已经退出,但该组中的其他进程仍然存在的情况下)重新使用进程ID。从而保证流程不会意外成为流程组组长。

0

xterm-S选项,允许它继承预先存在的过程中从终端,所以我觉得你可以做类似

main(){ 
    if(!fork()){ 
     int master, slave; 
     char slvname[BUF_SIZ]; 
     openpty(&master, &slave, slvname, NULL, NULL); 
     if(!fork()){ 
      execlp("xterm", "xterm", "-S", slvname, NULL); 
     } 
     write(master, "new term\n", 9); //or do you write to the slave? 
    } 
    printf("original term\n"); 
}