调用fdopen()之后的Errno 22

时间:2012-06-23 02:20:09

标签: c++ linux pipe errno

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

根据我的阅读,errno 22 fdopen()可能意味着模式参数不正确。我还读到它可能是来自fnctl的错误,这可能意味着错误的文件描述符。我指定文件描述符4,它适用于第一个子进程。这可能是我尝试创建另一个errno时将FILE*设置为22的原因吗?

我无法弄清楚它何时适用于一个子进程但不适用于下一个进程。任何人都可以为我阐明这一点吗?

以下是代码:

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;
}

1 个答案:

答案 0 :(得分:1)

对于第一个子进程,文件描述符的编号为4.对于第二个子进程,4在父进程中使用,因此它获取一些其他文件描述符编号。孩子要么必须搜索文件描述符,要么父母必须将其传达给环境中的孩子,孩子的命令行或其他方式。