`

文件描述符复制函数

阅读更多
    复制文件描述符常用的地方就是在重定向中。下面两个函数都可以用来复制一个现有文件描述符。
#include <unistd.h>

int dup(int fd);
int dup2(int fd, int fd2);
            /* 两函数的返回值:若成功,返回新的文件描述符;否则,返回 -1 */

    由 dup 函数返回的新文件描述符一定是当前可用文件描述符中的最小数值。对于 dup2 函数,可以用 fd2 参数指定新描述符的值。如果 fd2 已经打开,则先将其关闭。如若 fd 等于 fd2,则返回 fd2,而不关闭它。否则,fd2 的 FD_CLOEXEC 文件描述符标志就被清除,这样 fd2 在进程调用 exec 时是打开状态。
    这些函数返回的新文件描述符与参数 fd 共享同一个文件表项,类似下图所示:

    复制一个描述符的另一种方法是使用 fcntl 函数。实际上,调用
        dup(fd);
    等效于
        fcntl(fd, F_DUPFD, 0);
    而调用
        dup2(fd, fd2);
    等效于
        close(fd2);
        fcntl(fd, F_DUPFD, fd2);
    在后一种情况下,dup2 并不完全等同于 close 加上 fcntl。它们之间的区别具体如下:
    (1) dup2 是一个原子操作,而 close 和 fcntl 却包括了两个函数调用。有可能在close和 fcntl 之间调用了信号捕获函数,它可能修改文件描述符。如果不同的线程改变了文件描述符的话也会出现相同的问题。
    (2) dup2 和 fcntl 有一些不同的 errno。
    另外,较新的系统都提供了名为 /dev/fd 的目录,其目录项是名为 0、1、2 等的文件。打开 /dev/fd/n 等效于复制描述符 n(假定描述符 n 是打开的)。例如下列函数调用:
        fd = open("/dev/fd/0", mode);
    就等效于
        fd = dup(0);
    不过大多数系统都忽略它所制定的 mode,而另外一些系统则要求 mode 必须是所引用的文件初始打开时所使用的打开模式的一个子集(Linux 中的 /dev/fd 是个例外。其中的描述符是指向底层物理文件的符号链接。例如,打开 /dev/fd/0 实际上正在打开与标准输入关联的文件,因此返回的新文件描述符的模式与 /dev/fd 文件描述符的模式其实并不相关)。
    还有些系统提供路径名 /dev/stdin、/dev/stdout 和 /dev/stderr,这些等效于 /dev/fd/0、/dev/fd/1 和 /dev/fd/2。/dev/fd 中的文件主要由 shell 使用,它允许使用路径名作为调用参数的程序,能用处理其他路径名的相同方式处理标准输入和输出。
  • 大小: 20.5 KB
分享到:
评论

相关推荐

    fcntl函数复制文件描述符

    fcntl函数复制文件描述符,此例只是用来留作笔记,

    API之网络函数---整理网络函数及功能

    LZOpenFile 该函数能执行大量不同的文件处理,而且兼容于压缩文件 LZRead 将数据从文件读入内存缓冲区 LZSeek 设置一个文件中进行读写的当前位置 MapViewOfFile 将一个文件映射对象映射到当前应用程序的地址空间 ...

    LINUX输入输出与文件

    LINUX输入输出与文件 1 1. 基于文件指针的文件操作(缓冲) 1 1.1. 文件的创建,打开与关闭 1 1.2. 读写文件 2 1.3. 标准输入/输出流 5 2. 基于文件描述符的文件操作(非缓冲) 6 ...2.7. 文件描述符的复制 10

    IO多路复用之poll全面总结(必看篇)

    poll和select同样存在一个缺点就是,包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,而不论这些文件描述符是否就绪,它的开销随着文件描述符数量的增加而线性增大。 2、poll函数 函数格式如下所...

    精通WindowsAPI 函数 接口 编程实例

    此书电子版的共547页,本人分卷上传300页,后面部分将陆续...17.2.3 列举安全对象的安全描述符 515 17.2.4 修改安全描述符 521 17.3 用户 522 17.3.1 创建用户 522 17.3.2 用户组 523 17.3.3 删除用户 525...

    深入解读Linux进程函数fork(),vfork(),execX()

    本文研究的主要是Linux进程函数fork...4、虽然子进程复制了文件描述符,而对于文件描述符相关的文件表项(struct file结构),则采用共享的方式。 一个实例: #include &lt;unistd&gt; //fork fuction #include &lt;fcntl&gt; //fil

    精通Windows.API-函数、接口、编程实例.pdf

    仅收录该书籍以供学习和讨论 包含pdf书籍及经过验证的示例 执行demo中的示例方式 在编译环境下进入demo目录,执行...17.2.3 列举安全对象的安全描述符 515 17.2.4 修改安全描述符 521 17.3 用户 522 17.3.1 ...

    Python通过select实现异步IO的方法

    select函数的参数是3个列表,包含整数文件描述符,或者带有可返回文件描述符的fileno()方法对象。第一个参数是需要等待输入的对象,第二个指定等待输出的对象,第三个参数指定异常情况的对象。第四个参数则为设置...

    linux网络编程-宋敬彬-part1

    8.3.1 进行文件描述符判定的函数issockettype() 224 8.3.2 main()函数 224 8.4 IP地址与域名之间的相互转换 225 8.4.1 DNS原理 225 8.4.2 获取主机信息的函数 226 8.4.3 使用主机名获取主机信息的例子 228...

    linux网络编程-宋敬彬-part2

    3.2.1 文件描述符 72 3.2.2 打开创建文件open()、create()函数 72 3.2.3 关闭文件close()函数 76 3.2.4 读取文件read()函数 77 3.2.5 写文件write()函数 79 3.2.6 文件偏移lseek()函数 80 3.2.7 获得...

    linux网络编程-宋敬彬-part3

    3.2.1 文件描述符 72 3.2.2 打开创建文件open()、create()函数 72 3.2.3 关闭文件close()函数 76 3.2.4 读取文件read()函数 77 3.2.5 写文件write()函数 79 3.2.6 文件偏移lseek()函数 80 3.2.7 获得...

Global site tag (gtag.js) - Google Analytics