我正在编写一个shell,如果命令要放在后台运行,不确定该如何处理。 已解析命令,对于前台运行的命令fork可以工作。现在可以确定命令是否放在后台运行。但是我不确定代码中第一个else if应该怎么做。希望能够得到关于如何处理后台命令的指导。
pid_t childpid;
int status;
childpid = fork();
if (childpid >= 0) // fork succeeded
{
if (childpid == 0 && background == 0) // fork() returns 0 to the child
{
if (execv(path, strs) < 0)
{
perror("Error on execv.");
}
exit(0); // child exits
}
else if (childpid == 0 && background ==1)
{
// What goes here?
}
else // fork() returns new pid to the parent
{
wait(&status);
}
}
else // fork returns -1 on failure
{
perror("fork"); // display error message
exit(0);
}
execve()
时,您可能希望使该子进程以非零退出码(1或者如果想符合POSIX标准,则是126或127)退出。此外,您有一个“灌木”决策树。尝试重写代码,避免在做出决策后立即做出另一个决策:if (childpid < 0) ...error... else if (childpid == 0) ...execve... else if (background == 0) ...wait loop... else ...process run in background...
。请注意wait loop
;您可能需要等待之前的后台进程完成。 - Jonathan Leffler