所以我试图创建一个基本终端,我的问题是:如果我使用以下代码执行大多数“正常”终端命令(例如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在这里失败吗?