linux打开/dev/fd/n和复制它一样吗?

问题描述 投票:0回答:1

在 APUE 和 Linux 编程接口中,我阅读了以下段落

打开/dev/fd目录下的其中一个文件相当于 复制相应的文件描述符。因此,以下 语句是等效的:

fd = open("/dev/fd/1", O_WRONLY);

fd = dup(1); /* 重复标准输出 */

当我在描述符 3(在常规文件上)上测试此场景时,我看到了不同的结果。代码如下:

#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>

int main (int argc, char *argv[]) {
        int fd1, fd2, fd3;
        char filename[32];

        fd1 = open ("./data.in", O_RDWR);
        sprintf (filename, "/dev/fd/%d", fd1);
        fd2 = open (filename, O_RDONLY);
        fd3=dup(fd1);

        lseek(fd1, 10, SEEK_SET);
        printf ("pos1=%ld, pos2=%ld, pos3=%ld\n", lseek(fd1, 0, SEEK_CUR), lseek(fd2, 0, SEEK_CUR), lseek(fd3, 0, SEEK_CUR));
 
         return (0);
 }

如果打开

/dev/fd
目录中的文件相当于通过
dup
复制它,我除了所有3个描述符在
lseek(fdn, 0, SEEK_CUR
中具有相同的值),但我看到了以下结果:

pos1=10, pos2=0, pos3=10

我不知道为什么!

linux gcc dup
1个回答
0
投票

正如

Barmar
所说,它看起来像是一个文档错误。 open() 总是在文件表中创建一个新条目。 dup() 只是创建一个引用相同文件表条目的新 FD。可查找流中的当前位置位于文件表中

© www.soinside.com 2019 - 2024. All rights reserved.