2

Cプログラムを介してシェルをエミュレートしようとしています。私のプログラムでは、通常の (フォアグラウンド) コマンドを実行するたびに正常に動作します。また、「&」で終わるコマンドでバックグラウンド プロセスを処理しました。これを処理するために、子プロセスを待機する親を回避しました。

問題は、シェルで初めてバックグラウンド コマンド (つまり、'&' で終わるコマンド) を実行すると、正常に動作することです。しかし、その後、各コマンド(通常)は終了しません。以前に開いたプロセスを待っていると思います。修正する方法。私はあなたに自分自身をより明確にすることができるように、質問をすることができます. これは、上記のタスクを実行しているスニペットです。

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 と同じプロセス グループ ID を持つ子プロセスを待ちます。したがって、切断された子プロセスの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 に答える