9

コマンドの最後に「&」が見つかった場合、バックグラウンドでプロセスを実行するbash機能を模倣しようとしています。私は次の機能を持っています...そして、私がやりたいことをしているとは思いません

int execute(char* args[],int background,int *cstatus){
    pid_t   child;
    pid_t   ch;                         /*Pid of child returned by wait*/
    if ((child = fork()) == 0){                 /*Child Process*/
        execvp(args[0],args);       
        fprintf(stderr, "RSI: %s: command not found\n",args[0]); /*If execvp failes*/
        exit(1);

    }else{          /*Parent process*/
        if (child== (pid_t)(-1)) {
            fprintf(stderr,"Fork failed\n"); exit(1);
        }else{
            if (background==0){             /*If not running in background..wait for process to finish*/
                ch = wait(cstatus);
            }else{
                printf("%ld Started\n",(long)getpid());
        /*  printf("Parent: Child %ld exited with status = %ld\n", (long) ch, (long)cstatus);
    */  }}
    }
return 0;
}
int wait_and_poll(int *cstatus){
    pid_t status;
    status = waitpid(-1,cstatus,WNOHANG);
    if (status>0){
        fprintf(stdout,"%ld Terminated.\n",(long) status);
    }
return 0;
}

「ls -l」を実行するだけで期待どおりに動作します..しかし、バックグラウンドで ls を実行し、プログラムに新しいコマンドを受け入れさせ続ける場合は、バックグラウンド フラグを 1 に設定して関数を呼び出します。プロセスをバックグラウンドで実行し、プロセスが作成されたことを伝えてから、次のコマンドを受け入れるように求めます。

4

2 に答える 2

6

私はwaitpid(-1, &cstatus, WNOHANG);あなたが思っていることをしないと思います。戻り値を確認する必要があります。である場合、それは> 0終了した子プロセスの PID です。0またはの場合-1、状態が変化した子プロセスはありません。

waitpid(-1, &cstatus, WNOHANG);実行する各コマンドの前および/または後に呼び出すことができます。複数の子出口をキャッチするには、ループで呼び出します。

SIGCHILD も処理できます。プロセスは、子プロセスが終了した直後にこのシグナルを受け取ります。これは、ユーザーの入力を待たずに、子プロセスの終了をすぐに報告したい場合に適しています。

于 2013-01-27T14:50:05.360 に答える
4

それは簡単です。ID pid のプロセス P があるとします。

バックグラウンドで実行したい場合(シェル/プログラムへの入力文字列の最後にある & によって認識できます)、これを行う必要があります

//some code
id=fork();
if(id==0)
{
//child does work here
}
else
{
//Parent does work here
if(!strcmp(last string,"&")==0)waitpid(id,&status,0);
}

したがって、バックグラウンド実行を要求した場合、親は待機しません。それ以外の場合は待機します。

于 2013-01-27T15:10:52.257 に答える