0

调用时出现错误fdopen,它设置errno为 22。我正在使用 exec 命令调用子进程。子进程调用fdopen文件描述符 4。第一个子进程工作并将数据发送回父errno进程,为 0。父进程创建下一个子进程后,fdopen(4, "w");再次调用,此时errno设置为 22。

根据我的阅读,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。对于第二个子进程,4 正在父进程中使用,因此它获取其他文件描述符编号。孩子要么必须搜索文件描述符,要么父母必须在环境中、在孩子的命令行上或其他方式将其传达给孩子。

于 2012-06-23T02:23:50.373 回答