0

呼び出し時にエラーが発生し、22 にfdopen設定errnoされます。exec コマンドを使用して子プロセスを呼び出しています。子はfdopenファイル記述子 4 を呼び出します。最初の子は機能し、データを親に送り返します。親errnoは 0 です。親が次の子プロセスを作成した後、fdopen(4, "w");再度呼び出されます。これは がerrno22 に設定されている場合です。

私が読んだことから、errno22 forfdopen()はモード引数が正しくないことを意味する可能性があります。fnctlまた、それはエラーである可能性があり、それはファイル記述子が悪いことを意味する可能性があることも読みました。ファイル記述子 4 を指定すると、最初の子プロセスで動作します。errno別の を作成しようとすると 22 に設定されているのはそのためでしょうFILE*か?

ある子プロセスではいつ機能するのかわかりませんが、次の子プロセスでは機能しません。誰かが私のためにこれに光を当てることができますか?

コードは次のとおりです。

int main(int argc, char* argv[])
{
    cout << "Child " << argv[argc-1] << " starting" << endl;
    //close(3);
    if(argc < 1) fatal("Not enough arguments provided to ChildMain");
    int id = atoi(argv[argc-1]);
    //Child kid((int) *argv[1]);
    cout << "Error before fdopen(): " << errno << endl;
    FILE* out = fdopen(4, "w");
    if(out == NULL)
    {
        cout << "Child ID: " << id << endl;
        cout << "\tError: " << errno << endl << endl;
    }
    int ret = fprintf(out, "%d", id);
    fflush(out);
    return 0;
}
4

1 に答える 1

1

最初の子プロセスでは、ファイル記述子の番号は 4 です。2 番目の子プロセスでは、親で 4 が使用されているため、別のファイル記述子番号を取得します。子はファイル記述子を検索する必要があるか、親は環境内、子のコマンドライン、またはその他の方法で子にそれを伝える必要があります。

于 2012-06-23T02:23:50.373 に答える