几乎一切都像它应该的那样工作,除非它达到if(execvp .....)。 if语句可以正常工作,但不会返回命令行。如果/ bin / ls,它将打印所有内容,但是除光标外,下一行将为空白。如果它到达printf(...“未找到命令”......),则相同。我最好的猜测是父进程在孩子面前完成/终止,但是如果这是问题,我还没有找到补救措施。希望问题在于eval。 (这不是复制/粘贴,因此可能存在小错误)
void eval(char *cmdline)
{
int bg;
char *argv[MAXARGS];
pid_t pid;
sigset_t mask;
///
bg = parseline(cmdline, argv);
///
if (!builtin_cmd(argv)) {
sigemptyset(&mask);
sigaddset(&mask, SIGCHLD);
sigaddset(&mask, SIGINT);
sigaddset(&mask, SIGSTP);
sigprocmask(SIG_BLOCK, &mask, NULL);
///
if ((pid = fork()) < 0) {
unix_error("...");
}
else if (pid == 0) {
sigprocmask(SIG_UNBLOCK, &mask, NULL);
setpgid(0,0);
///
if (execvp(argv[0], argv) < 0) {
printf("Command not found");
exit(0);
}
}
else { //state of process: FG == foreground, BG== background
if (!bg) {
addjob(jobs, pid, FG, comdline);
sigprocmask(SIG_UNBLOCK, &mask, NULL);
waitfg(pid); //waits for pid to not be foreground process
}
else {
// same as above, except swap FG for BG and no waitfg()
}
}
}
return;
}