C ++如何复制FILE *指针

时间:2019-04-04 19:26:09

标签: c++ c linux

我在Duplicating file pointers?

处找到了解决方案
FILE *fp2 = fdopen (dup (fileno (fp)), "r");

但根据http://man7.org/linux/man-pages/man2/dup.2.htmldup创建的新文件描述符,它们引用相同的打开文件描述符,因此共享状态。那不是我想要的我想创建一个全新的IO对象,该对象引用由旧FILE *

指向的文件

有什么办法吗?

添加: 我实际上没有文件名。我正在复制一个对象的深层副本,该对象包含一个打开的FILE指针,因此也必须复制该对象。

1 个答案:

答案 0 :(得分:4)

  

我想创建一个全新的IO对象,该对象引用由旧FILE *指向的文件

您假设与原始FILE *关联的文件具有某种形式的标识,该标识与通过其访问的IO对象不同。对于常规文件和某些其他对象,这是正确的,但对于其他对象(例如套接字和管道),则是错误的。因此,没有通用的机制可以执行您的要求。

对于可以通过文件系统访问的对象的特殊情况,创建与相同文件关联的新IO对象的方法是通过以下路径open()fopen()它。这些功能就是这样做的。没有从FILE *或文件描述符编号获取路径的标准方法,但是在Linux(因为已对其进行了标记)上,可以在readlink()中打开文件的条目上使用/proc,如here所述。

请注意,即使对于常规文件,也无法保证readlink方法有效。特别是,如果此后取消了打开原始文件的路径的链接,则将不起作用,实际上,在这种情况下,它可能导致打开错误的文件。您可以通过在旧文件描述符编号和新文件描述符编号上运行fstat()来进行检查-如果文件实际上相同,则它们将在同一主机设备上具有相同的inode编号。