是否可以从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编号

然后在fclosedup2(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!