改变控制终端

时间:2011-12-22 19:27:21

标签: c linux ubuntu process terminal

我想出了类似的东西..

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。

2 个答案:

答案 0 :(得分:0)

我认为您应该使用setpgid()将孩子与其父母断开连接。

From Wiki

系统调用setpgid()用于设置进程的进程组ID,从而将进程加入现有进程组,或者在进程会话中创建新进程组,进程成为进程新成立的小组的组长。 POSIX禁止重复使用进程ID,其中具有该标识符的进程组仍然存在(即进程组的领导者已退出,但该组中的其他进程仍然存在)。从而保证流程不会偶然成为流程组的领导者。

答案 1 :(得分: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");
}