2

こんにちは私はUNIXシェルに取り組んでおり、2つの問題が発生しています。誰か助けてくれないかと思っていました。私の最初の問題は、シェルが子プロセスの終了を待機していないことです。子プロセスの実行中に、実際にさらにコマンドを入力することができます。私の2番目の問題は、次の2行にあります。シェルに何も表示されません。

    fprintf(stderr, "Process name is: %s\n", commandArgv[0]);
    fprintf(stderr, "Child pid = %d\n", pid);

ユーザーが入力したプロセスを実行するには、次の方法があります。つまり、firefox、ls-aなどです。

void execute(char *command[], char *file, int descriptor){
    pid_t pid;
    pid = fork();

    if(pid == -1){
        printf("error in execute has occurred\n");
    }
    if(pid == 0){           
        execvp(*command,command);
        fprintf(stderr, "Process name is: %s\n", commandArgv[0]);
        fprintf(stderr, "Child pid = %d\n", pid);
        wait(&status);
            exit(EXIT_SUCCESS);
    }
    else{
        printf("ignore for now\n");
    }
}

ここで、executeコマンドを呼び出します。正常に動作し、プロセスを起動しますが、終了するのを待ちません。

 execute(commandArgv, "STANDARD",0);

君たちは私が間違っているかもしれないことを知っていますか?いつもありがとうございます。これについて私を助けてくれてありがとう。

4

3 に答える 3

4

execvp()が実行されると、戻ることはありません。実行中のアプリをメモリ内で提供されたものに置き換えます。したがって、fprintf()とwait()は間違った場所にあります。

于 2009-09-23T18:19:13.237 に答える
1

実際のロジックを正しく機能させる以外に(Stéphaneの提案はすべて良好です)、エラーメッセージがバッファリングされるのではなく、すぐに解決されるように、fprintf-ingの後にfflush(stderr)することもできます。

于 2009-09-24T21:31:31.407 に答える
1

プロセスの動作に少しエラーがあります。execvpが呼び出された後、後戻りすることはありません。fork()を使用すると、親と同一の子が得られますが、execvpは子イメージを上書きして、呼び出しているコマンドにします。

execvpは、イメージの上書きを妨げる重大なエラーが発生した場合にのみ返されます。したがって、呼び出す前に印刷する必要があります。そのため、そこでEXIT_SUCCESSEXIT_FAILUREに変更することもできます。

ここで、 waitを使用する別の間違いがあります。その逆ではなく、常に親が子を待機するようにします。子供に待つように頼むことはできません。彼女は待つものが何もない、彼女は走って終了するだろう。したがって、wait()呼び出しをelse部分に移動する必要があります。

void execute(char *command[], char *file, int descriptor)
{
    pid_t pid;
    pid = fork();

    if(pid == -1)
    {
        printf("fork() error in execute() has occurred\n");
        return; /* return here without running the next else statement*/
    }
    if(pid == 0)
    {           
        fprintf(stderr, "Process name is: %s\n", commandArgv[0]);
        fprintf(stderr, "Child pid = %d\n", getpid());
        execvp(*command,command);
        fprintf(stderr, "Error! Can't overwrite child's image!\n");
        exit(EXIT_FAILURE);
    }
    else
    {
        printf("Parent waiting for child pid: %d\n", pid);
        wait(&status);
        printf("Parent running again\n");
    }
}

しかし、あなたの質問を読んで、多分あなたは実際に親を待たせたくないでしょう。その場合は、wait()関数を使用しないでください。

気をつけて、ベコ

編集:いくつかの小さな間違い。子のpidはgetpid()です

于 2011-04-08T17:44:40.617 に答える