3

私はシェルを作成していますが、コマンドをバックグラウンドに配置する場合の対処方法について混乱しています。コマンドを解析しました。フォークはフォアグラウンドにあるコマンドに対して機能します。コマンドをバックグラウンドに置くかどうかを判断できるように、私はそれを持っています。私のコードの場合、最初に何をすべきかよくわかりません。バックグラウンドコマンドにアプローチする方法についてのポインタをいただければ幸いです。

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 に答える