3.12 文件I/O_dup和dup2函数

来源:互联网 发布:论网络暴力英文 编辑:程序博客网 时间:2024/05/16 05:12

    下面两个函数都可用来复制一个现存的文件描述符:

  • #include <unistd.h>
  • int dup(int filedes);
  • int dup2(int filedes, int filedes2);

返回值:成功返回新的文件描述符,出错返回-1

    有dup返回的新文件描述符一定是当前可用文件描述符的最小数值。用dup2则可以用filedes2参数指定新描述符的数值。如果filedes2已经打开,则先将其关闭。如若filedes等于filedes2,则dup2返回filedes2,而不关闭它。

 

    这些函数返回的新文件描述符与参数filedes共享同一个文件表项:

图3.3 执行dup(1)后的内核数据结构

 

    每个文件描述符都有它自己的一套文件描述符标志。例如,新描述符的执行时关闭(close-on-exec)标志总是有dup函数清除。

    复制一个描述符的另一种方法是使用fcntl函数。实际上,

  • 调用dup(filedes); 等效于 fcntl(filedes, F_DUPFD, 0);
  • 调用dup2(filedes, filedes2); 等效于 close(filedes2);fcntl(filedes, F_DUPFD, filedes2);

在后一种情况下,dup2并不完全等同于close加上fcntl。它们之间的区别是:

  • dup2是一个原子操作,而close及fcntl则包括两个函数调用。有可能在close和fcntl之间插入执行信号捕获函数,它可能修改文件描述符。
  • dup2和fcntl有某些不同的errno。

 

原创粉丝点击