2

我试图通过 C 程序模拟 shell。在我的程序中,每当我运行任何正常(前台)命令时,它都可以正常工作。我还处理了以“&”结尾的命令的后台进程。现在为了处理这个问题,我避免了父进程等待子进程。

问题是每当我第一次在我的 shell 中运行任何后台命令(即以 '&' 结尾)时,它都可以正常工作。但是之后每个命令(正常)都不会终止。我猜它等待先前打开的进程。如何整顿。请你可以提出问题,以便我可以让你更清楚。这是执行上述任务的代码段。

child_id=fork();
if(child_id==0){
        //logic fo creating command
        int ret=execvp(subcomm[0],subcomm);
}
//Child will never come here if execvp executed successfully
if(proc_sate!='&'){
        for(i=0;i<count_pipe+1;i++){            
            waitpid(0,&flag,0);
            }
        //something to add to make it not wait for other process in my scenario for second time 
}

这里proc_state只是判断是背景还是前景。它只是一个字符。count_pipe 只是一个保存管道数量的变量(例如 ls -l|wc|wc 这包含 2 个管道)。别担心,这一切都很好。

4

1 回答 1

2

waitpid(0, &flag, 0)等待其进程组 ID 等于您的 shell 的任何子进程。所以如果你没有在断开连接的子进程setsid()之后调用fork(),上面的代码也会等待。

pid_t pid = fork();
if (pid == 0) { /* child process */
    setsid(); /* Child creates new process group */
    ... /* redirections, etc */
    execvp(...);
}
于 2013-09-12T20:39:54.390 回答