调用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;
}
答案 0 :(得分:1)
对于第一个子进程,文件描述符的编号为4.对于第二个子进程,4在父进程中使用,因此它获取一些其他文件描述符编号。孩子要么必须搜索文件描述符,要么父母必须将其传达给环境中的孩子,孩子的命令行或其他方式。