在APUE和The Linux programming interface中,我读到了以下段落

打开/dev/stra目录中的其中一个文件相当于 复制相应的文件描述符.因此,以下内容 声明等效:

帖子主题:Re:Колибрибудетбольшеврешки

ph = 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.可查找流中的当前位置位于文件表中

Linux相关问答推荐

在Groff mm中定义页眉不会更改第一页中的页眉

如何使用 sed 和 date 命令替换和格式化字符串中的日期?

X86 程序集 - struct 点 - 存储/返回不正确?

如何在vim中使用正则表达式来切换文件中所有字符的大小写

从 Ansible 中的 shell 命令输出中提取特定数据

如何使用 Bash 将随机数据块写入文件

Docker 容器立即退出

如何计算制表符分隔的文本文件中字段的唯一值的数量?

如何将文件从 Vagrant 机器复制到 localhost

通过 Linux FrameBuffer 将像素绘制到屏幕上

对一行的最后一个字段进行排序

在 Ubuntu 上运行自包含的 ASP.NET Core 应用程序

仅在不存在时添加换行符

Anaconda 安装后,conda 命令失败并显示ImportError: no module named conda.cli

Bash:在文件中的特定位置插入一行

env和set(在 Mac OS X 或 Linux 上)有什么区别?

`cd //` 中的双斜杠 // 在 Linux 中是什么意思?

在 reverse-i-search (Ctrl+R ) , 历史上类似命令之间切换的任何方法

如何使用 sed 通过灵活的键和值更改我的配置文件?

编译 OpenGL 程序 GL/glew.h 缺失