c-是否可以从file*中拯救文件描述符



我必须使用某个跨平台库来传递FILE*对象。

我从另一个源(继承的)获得一个文件描述符,我希望在fork'd进程中保持相同的fd

我目前使用fdopen将文件描述符转换为FILE*对象。

我的问题是,用于清理FILE*对象的fclose关闭了连接的文件描述符。

我非常想在使用完这个文件描述符后保留它。

有办法从FILE*中拯救文件描述符吗?

有办法把它拆下来吗?

或者用一个伪文件替换FILE*中的文件描述符?

附言:这需要跨平台,无论如何都要跨POSIX。

假设fd是你的文件描述符,f是你的file*

fd2 = dup(fd);
fclose(f);
dup2(fd2, fd);
close(fd2);

我的问题是用于清理FILE*对象的fclose关闭连接的文件描述符。

您可以使用dup(2)来获取描述符的副本。那么CCD_ 16所做的CCD_。

我需要保持完全相同的fd编号

然后在fclose之后再次调用dup2dup2(savedfd, rescuedfd)

当您从另一个源获取文件描述符时,请尝试从该文件描述符获取其文件名。(有人说,使用特定平台的方法是可能的。-谷歌一下。)

一旦你得到文件名,然后再次打开它,得到FILE*,然后用fclose完成你的工作并清理它。

您原来的fd不会受到干扰。

这里有一个不可移植的想法(如果你认为这是好的/最好的,请投票):

GNU libc提供了fopencookie,BSD提供了等效的funopen

这些返回真正的FILE*句柄,但实现是您自己的:

将读/写/寻找/关闭函数映射到底层系统调用是相对琐碎的:

read/readfn(cookie, buf, size){ return read((int)cookie, buf, size); }
write/writefn(cookie, buf, size) { return write((int)cookie, buf, size); }
seek/seekfn(cookie, offs, arg) { return seek((int)cookie, offs, arg); } // may require arg mapping to whence
close/closefn(cookie) {} // that's the whole point!

相关内容

  • 没有找到相关文章

最新更新