我正在制作一个shell,如果要将一个命令放在后台,我会感到很困惑。 我已经解析了我的命令,fork适用于前台的命令。我有它所以可以确定是否要在后台放置一个命令。如果是我的代码,我不确定该怎么办。任何有关如何处理背景命令的指针都将受到赞赏。
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);
}
答案 0 :(得分:1)
孩子并不关心它是否在后台运行,所以只需像往常一样调用exec
。在父过程中,您必须采取不同的行为。
首先,您不能再使用wait
,因为这将阻止父进程。相反,您可以使用带有负pid的waitpid
和WNOHANG
标志来检查已终止的子进程而不会阻塞。
另一个不涉及定期调用waitpid
的常见解决方案是使用SIGCHLD
信号,该信号将在子进程停止或终止时引发。