5

C コードからコマンド ラインを実行しようとしていますが、fgets() 関数に到達すると NULL エラーが発生します。

void executeCommand(char* cmd, char* output) {
    FILE *fcommand;
    char command_result[1000];
    fcommand = popen(cmd, "r");
    if (fcommand == NULL) {
        printf("Fail: %s\n", cmd);
    } else {
        if (fgets(command_result, (sizeof(command_result)-1), fcommand) == NULL)
             printf("Error !");
        strcpy(output, command_result);
    }
    pclose(fcommand);
}

そして、私のコマンドは次のとおりです。

java -jar <parameters>

端末で同じコマンドを実行しようとすると、期待どおりに機能するにもかかわらず、fgets から NULL の結果が得られるのはなぜですか。

4

1 に答える 1

4

fgets() は、stream から最大で size 未満の 1 文字を読み取り、s が指すバッファーに格納します。EOF または改行の後、読み取りは停止します。改行が読み取られると、バッファに格納されます。'\0' は、バッファー内の最後の文字の後に格納されます。

要するに、popen()は afork()を実行しており、 によって呼び出されたプログラムが出力を生成する前にパイプから読み取ろうとしているため、パイプにcmdはデータがなく、パイプでの最初の読み取りは を返すEOFため、fgets()データを取得せずに戻ります。スリープするか、ポーリングを行うか、ブロッキング読み取りを行う必要があります。

于 2013-04-08T15:21:23.377 に答える