3

我正在制作一个外壳,如果要将命令放在后台,我会感到困惑。我已经解析了我的命令,并且 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); 
}
4

1 回答 1

1

孩子不在乎它是否在后台运行,所以照常exec打电话。在进程中,您必须表现得不同。

首先你不能再使用wait,因为这会阻塞父进程。相反,您可以使用waitpid负 pid 和WNOHANG标志来检查终止的子进程而不会阻塞。

另一个不涉及waitpid定期调用的常见解决方案是使用SIGCHLD信号,该信号将在子进程停止或终止时引发。

于 2012-10-24T05:01:28.300 回答