我在调用fdopen时收到一个错误,它将errno设置为22。我正在使用exec命令调用子进程。子进程对文件描述符4调用fdopen。第一个子进程工作并将数据发送回父进程,errno为0。父进程创建下一个子进程后,将在errno设置为22时再次调用fdopen(4, "w");。
据我所知,fdopen()的errno 22可能意味着模式参数是不正确的。我还读到这可能是来自fnctl的错误,这可能意味着文件描述符不正确。我指定文件描述符4,它在第一个子进程上工作。这是否就是为什么当我尝试创建另一个FILE*时errno被设置为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;
}发布于 2012-06-23 10:23:50
对于第一个子进程,文件描述符的编号是4。对于第二个子进程,父进程中使用的是4,因此它会获得其他一些文件描述符编号。子进程要么必须搜索文件描述符,要么父进程必须通过子进程的命令行或其他方式与环境中的子进程进行通信。
https://stackoverflow.com/questions/11166273
复制相似问题