2012-10-23 125 views
2

我正在制作一个shell,我很困惑如果命令放在后台怎么办。 我已经解析了我的命令,fork对前台的命令有效。我有它,所以可以确定命令是否放在后台。我真的不知道如果我的代码在第一个人该做什么。任何关于如何处理后台命令的指针都会被赞赏。后台进程c

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

正如Joachim所说,它是不同的父代码,而不是子代码。作为一个细节,你可能希望孩子在不能执行'execve()'时以非零的退出代码(1,或者如果你想成为POSIX兼容的话可能是126或127)死掉。此外,你有一个“浓密的”决策树。尝试重写代码以避免在作出决定后立即作出决定:if(childpid <0)... error ... else if(childpid == 0)... execve ... else if(background == 0 )...等待循环...其他...进程在后台运行...'。注意'等待循环';您可能会完成前面的后台进程。 –

回答

1

,如果它在后台或无法运行孩子不关心,所以才称之为exec如常。这是在父母过程中你必须有不同的行为。

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

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