欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

文件描述符复制函数

程序员文章站 2022-07-10 22:12:43
...
    复制文件描述符常用的地方就是在重定向中。下面两个函数都可以用来复制一个现有文件描述符。
#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 共享同一个文件表项,类似下图所示:
文件描述符复制函数
            
    
    博客分类: unix编程 UnixcOS 
    复制一个描述符的另一种方法是使用 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 使用,它允许使用路径名作为调用参数的程序,能用处理其他路径名的相同方式处理标准输入和输出。
  • 文件描述符复制函数
            
    
    博客分类: unix编程 UnixcOS 
  • 大小: 20.5 KB
相关标签: Unix c OS