Установка группы процессов предотвращает запуск дочернего процесса - PullRequest
0 голосов
/ 15 сентября 2018

Итак, я пытаюсь создать базовый терминал, и моя проблема заключается в следующем: если я использую следующий код для выполнения большинства «обычных» команд терминала (например, ls, cat и т. Д.), Проблем нет , Он устанавливает группу процессов и работает отлично. Однако, когда я пытаюсь выполнить команду, такую ​​как vim ., кажется, что процесс немедленно останавливается. Если я уберу вызов setpgrp(), команда будет работать как положено (и выполняется с pgid управляющего терминала).

Вот мой код:

pid_t normal_cmd(char **argv, int bg) {
    int pid = fork(), status;
    if(pid < 0)
            unix_error("Could not fork child process");
    else if(!pid) { //child (this is the problematic area)
            setpgrp();
            status = execvp(argv[0], argv);
            if(status < 0)
                    unix_error("Could not exec child process");
    }
    else { //parent
            if(!bg) {
                    addjob(jobs, pid, FG);
                    pause(); //waitpid() is in SIGCHLD handler
                    struct job_t *cj = getjobpid(jobs, pid);
                    if(cj && cj->state != ST)
                            deletejob(jobs, pid);
            }
            else
                    addjob(jobs, pid, BG);
    }
    return pid;
}

Есть идеи, почему изменение группы процессов может привести к сбою vim?

1 Ответ

0 голосов
/ 16 сентября 2018

vim попытается прочитать с управляющего терминала, и поскольку его группа процессов не является группой процессов переднего плана, он получит сигнал SIGTTIN, который его приостанавливает. ls и другие «нормальные» команды не приостанавливаются, потому что они не читают из стандартного ввода (который в данном случае является терминалом).

В результате вызова setpgrp () создается новая группа процессов с вызывающим процессом в качестве лидера, а новая группа процессов не является основной группой процессов на терминале, пока вы не сделаете это с помощью tc setpgrp () или ioctl (TIOCSPGRP).

Подробнее о контроле за работой можно прочитать здесь . В особенности это , который объясняет, почему программа в фоновом режиме получает SIGTTIN, если она пытается прочитать из tty, но не SIGTTOU, если она пытается записать в нее.

...