我需要使用 C 从不同偏移量的文件中并发读取。
dup
不幸地创建了一个与原始文件共享偏移量和标志的文件描述符。
是否有像dup
这样不共享偏移量和标志的函数?
EDIT 我只能访问文件指针 FILE* fp;
我没有文件路径
编辑 除了 mac 和许多 linux 版本之外,该程序还为 windows 编译
解决方案 我们可以在 posix 系统上使用 pread,我为 windows 写了一个 pread 函数来解决这个问题 https://github.com/Storj/libstorj/blob/master/src/utils.c#L227
最佳答案
在 Linux 上,您可以从 /proc/self/fd/N
中恢复文件名,其中 N
是文件描述符的整数值:
sprintf( linkname, "/proc/self/fd/%d", fd );
然后在生成的链接名称上使用 readlink()
。
如果文件已被重命名或删除,您可能就不走运了。
但是为什么您需要另一个文件描述符?您可以在原始文件描述符上使用 pread()
和/或 pwrite()
来读取/写入文件而不影响当前偏移量。 (警告:在 Linux 上,pwrite()
到以追加模式打开的文件是错误的 - POSIX 规定 pwrite()
到以追加模式打开的文件将写入pwrite()
调用中指定的偏移量,但 Linux pwrite()
实现已损坏,将忽略偏移量并将数据附加到文件末尾 - see the BUGS section of the Linux man page)
关于C 文件描述符复制而不共享偏移量或标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42425963/