Сменить управляющий терминал - PullRequest
0 голосов
/ 22 декабря 2011

Я придумал что-то вроде этого ..

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. Как я могу это исправить, не делая глупостей, например for(;;) on ./client? Кроме того, весь этот метод не является оптимальным решением ...

То, что я действительно хотел бы сделать, это:

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 голосов
/ 23 декабря 2011

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");
}
0 голосов
/ 22 декабря 2011

Я думаю, что вы должны отключить ребенка от родителя, используя setpgid().

Из вики :

Системный вызов setpgid () используется для установки идентификатора группы процессов для процесса, тем самым либо присоединяя процесс к существующей группе процессов, либо создавая новую группу процессов в течение сеанса процесса, причем процесс становится процессом. руководитель группы вновь созданной группы. POSIX запрещает повторное использование идентификатора процесса, где группа процессов с этим идентификатором все еще существует (то есть, когда вышел лидер группы процессов, но другие процессы в группе все еще существуют). Тем самым это гарантирует, что процессы не могут случайно стать лидерами групп процессов.

...