1

AFAICS、子プロセスはfork()の親プロセスからstdout/stdinを継承します。これは、なぜ次のコードが機能しないのか疑問に思います。

int main(int argc, char *argv[])
{
    char *earg[] = {"echo", "Hello", NULL};

    if(fork() == 0) {
        printf("running echo...\n");
        execv("echo", earg);
        printf("done!\n");
        exit(0);
    } else {
        sleep(2);
    }

    return 0;
}   

この小さなプログラムを実行すると、2つのprintf()呼び出しがコンソールに正常に表示されます。しかし、エコーの呼び出しはどういうわけか失われます!コンソールの出力は次のとおりです。

running echo...
done!

エコー出力がコンソールに表示されない理由を誰かに説明してもらえますか?そして、どうすればこれを修正できますか?

4

2 に答える 2

4

あなたprintf("done")が呼び出されるので、あなたはexecv()明らかに失敗しました。すべてのexec()関数は、エラーが発生した場合にのみ戻ります。評価errnoすることで、失敗した理由を見つけることができます。

echo:へのパス全体を使用してみてください

 execv("/bin/echo", earg);

done編集:子供が出たらすぐに印刷したい場合はwait(NULL)、親に電話を追加する必要があります。wait()詳細および使用方法の例については、のマンページを参照してください。

于 2012-06-18T13:27:17.613 に答える
3

execvechoPATHでコマンドを検索しないため、失敗し、出力されます"done"(成功した場合execvは発生しないはずです)。execv動作するためのフルパスを提供する必要があります

代わりに使用することをお勧めしますexecvpechoPATH変数でコマンドを検索します。

于 2012-06-18T13:28:08.513 に答える