Som*_*ame 4 c linux file-descriptor
我有一个打开的文件描述符,我想复制它以便独立执行读取和查找。我看着
int dup(int old_fd)
Run Code Online (Sandbox Code Playgroud)
系统调用。问题是它真的不适合这里。手册页说明以下 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)");
}
}
Run Code Online (Sandbox Code Playgroud)