是否可以从FILE *中挽救文件描述符?
我必须使用某个跨平台库来传递FILE*
对象。
我从另一个源(inheritance)获取文件描述符,我想在fd
过程中保持相同的fd
。
我目前使用fdopen
将文件描述符转换为FILE*
对象。
我的问题是fclose
用于清理FILE*
对象关闭连接文件描述符。
我非常希望在使用它之后保留这个文件描述符。
有没有办法从FILE*
救援文件描述符?
有没有办法拆分它?
或者用虚拟替换FILE*
文件描述符的方法?
PS这需要跨平台,无论如何都要横跨POSIX。
假设fd
是你的文件描述符, f
你的FILE *来自它。 也许像下面这样的东西会起作用:
fd2 = dup(fd); fclose(f); dup2(fd2, fd); close(fd2);
我的问题是
fclose
用于清理FILE*
对象关闭连接文件描述符。
您可以使用dup(2)
来获取描述符的副本。 那么fclose(3)
所做的close(2)
将不会做任何事情。
我需要保持完全相同的fd编号
然后在fclose
: dup2(savedfd, rescuedfd)
之后再次调用dup2
从其他源获取文件描述符时,尝试从该文件描述符中获取其文件名。 (有人说它可能使用特定于平台的方法.– gogoogle it。)
一旦你得到文件名然后再次打开它并得到文件*并做你的工作并使用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!