我有一个打开的文件描述符,我想复制,以便独立地进行阅读和寻求。我看着
int dup(int old_fd)
syscall。问题是它在这里真的不合适。人页面陈述以下http://man7.org/linux/man-pages/man2/dup.2.html:
成功返回后,旧文件描述符 可以互换使用。他们指的是 打开文件描述(请参阅Open(2)),从而共享文件 偏移和文件状态标志;例如,如果文件偏移是 通过在其中一个文件描述符上使用lseek(2)修改, 另一个也更改了偏移。
有没有办法复制文件描述符,因此它们是完全独立的?
在Linux中,打开/proc/<pid>/fd/<n>
打开当前在fd n 上打开的文件,但这是一个新副本,而不是像您获得的链接副本一样dup()
和朋友。
这应该创建一个包含bar
的文件,一堆零字节,然后是foo
。与使用dup()
的版本对比。
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main(void)
{
int fd1, fd2;
char buffer[50];
fd1 = open("testfile", O_CREAT | O_TRUNC | O_RDWR, 0600);
sprintf(buffer, "/proc/self/fd/%d", fd1);
#ifndef USE_DUP
fd2 = open(buffer, O_RDWR);
if (fd2 == -1) {
perror("open");
}
#else
fd2 = dup(fd1);
#endif
if (lseek(fd1, 16, SEEK_SET) == -1) {
perror("lseek");
}
if (write(fd1, "foo", 3) == -1) {
perror("write(fd1)");
}
if (write(fd2, "bar", 3) == -1) {
perror("write(fd2)");
}
}
否 - 至少不是在posix定义的机制中。
如果要完全独立文件描述符,则需要避免共享的打开文件描述,这意味着独立的open()
或同等的。
有可能有一种特定于Linux的机制来完成我从未听说过的工作。但是,浏览系统呼叫Linux在http://man7.org/linux/man-pages/man2/没有提供启蒙。