在 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
我不知道为什么!
正如
Barmar
所说,它看起来像是一个文档错误。 open() 总是在文件表中创建一个新条目。 dup() 只是创建一个引用相同文件表条目的新 FD。可查找流中的当前位置位于文件表中