Терминал перестает печатать даже при запущенном процессе - PullRequest
0 голосов
/ 19 февраля 2020

Я пытался открыть дочерний процесс в новом терминале, но не нашел решения в Интернете или в какой-либо книге. Недавно я изучил Unix доменных сокетов и передаваемых файловых дескрипторов и попытался добиться этого, используя их.

Ниже приведен псевдокод для моей программы. send_fd и recv_fd - функции для передачи fds, как определено в книге Ричарда Стивенса.

Программы работают почти так, как ожидается. Вывод и ввод дочернего процесса перенаправляются на вновь созданный терминал. Но дочерний процесс может печатать только до тех пор, пока процесс temp все еще выполняется. Когда temp завершается, дочерний процесс прекращает печать в новом терминале, а новый терминал закрывается. Как мне это преодолеть? Заранее спасибо.

int forknt()
{
    system("gnome-terminal -- \"./temp\""); //run auxiliary program in a new terminal
    //sfd is fd of the unix domain socket used to connect to ./temp
    int fd0 = recv_fd(sfd); //get stdin of new terminal
    int fd1 = recv_fd(sfd); //get stdout of new terminal
    int c = fork();
    if(!c)
    {
        dup2(fd0, 0);
        dup2(fd1, 1);
    }
    close(sfd);
    return c;
}

int main()
{
    int c = forknt();
    printf("%d\n", c);
    return 0;
}

Код для вспомогательной программы temp

int main()
{
    send_fd(sfd, 0);
    send_fd(sfd, 1);
    return 0;
}

1 Ответ

0 голосов
/ 20 февраля 2020

Терминальная программа, которая устанавливает стандартные входы и выходы подпроцесса, который она запускает, и подключает их к себе для ввода / вывода, также завершится, когда подпроцесс завершится. Если вместо этого вы скажете gnome-terminal запустить оболочку после завершения первой ./temp программы, она останется открытой, и я думаю, что ваша первая программа сможет продолжить чтение и запись в дескрипторы переданных файлов.

gnome-terminal -- "./temp; exec sh"

См. этот Unix ответ .

...