FILE *fp2 = fdopen (dup (fileno (fp)), "r");
但根据http://man7.org/linux/man-pages/man2/dup.2.html,
dup
创建的新文件描述符,它们引用相同的打开文件描述符,因此共享状态。那不是我想要的我想创建一个全新的IO对象,该对象引用由旧FILE *
有什么办法吗?
添加: 我实际上没有文件名。我正在复制一个对象的深层副本,该对象包含一个打开的FILE指针,因此也必须复制该对象。
答案 0 :(得分:4)
我想创建一个全新的IO对象,该对象引用由旧
FILE *
指向的文件
您假设与原始FILE *
关联的文件具有某种形式的标识,该标识与通过其访问的IO对象不同。对于常规文件和某些其他对象,这是正确的,但对于其他对象(例如套接字和管道),则是错误的。因此,没有通用的机制可以执行您的要求。
对于可以通过文件系统访问的对象的特殊情况,创建与相同文件关联的新IO对象的方法是通过以下路径open()
或fopen()
它。这些功能就是这样做的。没有从FILE *
或文件描述符编号获取路径的标准方法,但是在Linux(因为已对其进行了标记)上,可以在readlink()
中打开文件的条目上使用/proc
,如here所述。
请注意,即使对于常规文件,也无法保证readlink
方法有效。特别是,如果此后取消了打开原始文件的路径的链接,则将不起作用,实际上,在这种情况下,它可能导致打开错误的文件。您可以通过在旧文件描述符编号和新文件描述符编号上运行fstat()
来进行检查-如果文件实际上相同,则它们将在同一主机设备上具有相同的inode编号。