Итак, я пытаюсь создать базовый терминал, и моя проблема заключается в следующем: если я использую следующий код для выполнения большинства «обычных» команд терминала (например, 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?