后台进程 c

3

我正在编写一个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); 
}

正如Joachim所说,不同的是父代码,而不是子代码。作为细节,当子进程无法执行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
1个回答

1

子进程无论是否在后台运行都不会关心,所以只需像平常一样调用exec即可。而在父进程中,您必须采取不同的行为方式。

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

另一个常见的解决方案是不需要定期调用waitpid,而是使用SIGCHLD信号,当子进程停止或终止时将被触发。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接