复制文件描述符并独立搜索它们

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) 修改了文件偏移量,则另一个文件描述符的偏移量也会更改。

有没有办法复制文件描述符,使它们完全独立?

ilk*_*chu 5

在 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)

  • @SomeName,实际上,不,它遵循重命名。打开它会直接访问 _inode_,但是,符号链接中显示的名称仅用于显示。它们不是普通的符号链接。(如果你有硬链接,它可以在符号链接中显示`(已删除)`,即使文件仍然存在,你仍然可以通过符号链接打开它) (3认同)