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