C-复制文件描述符,并独立通过它们



我有一个打开的文件描述符,我想复制,以便独立地进行阅读和寻求。我看着

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/没有提供启蒙。

相关内容

  • 没有找到相关文章

最新更新