dup() - Unix、Linux 系统调用
Tutorials Point


  Unix 初学者指南
  Unix Shell 编程
  高级 Unix
  Unix 有用参考
  Unix 有用资源
  精选阅读

版权所有 © 2014 tutorialspoint



  首页     参考     讨论论坛     关于 TP  

dup() - Unix、Linux 系统调用


previous next AddThis Social Bookmark Button

广告

名称

dup、dup2 - 复制文件描述符

语法

#include <unistd.h> int dup(int oldfd); int dup2(int oldfd, int newfd);

描述

dup() 和 dup2() 创建文件描述符 oldfd 的副本。

dup() 或 dup2() 成功返回后,可以互换使用旧文件描述符和新文件描述符。它们引用相同的文件打开描述符(参见 open(2)),因此共享文件偏移量和文件状态标志;例如,如果使用 lseek(2) 在其中一个描述符上修改文件偏移量,则另一个描述符的偏移量也会发生更改。

这两个描述符不共享文件描述符标志(close-on-exec 标志)。复制描述符的 close-on-exec 标志(FD_CLOEXEC;参见 fcntl(2))已关闭。

dup() 使用最低编号的未使用描述符作为新描述符。

dup2() 使 newfd 成为 oldfd 的副本,并在必要时先关闭 newfd

返回值

dup() 和 dup2() 返回新描述符,如果发生错误则返回 -1(在这种情况下,errno 会相应设置)。

错误

标签描述
EBADF oldfd 不是打开的文件描述符,或者 newfd 超出了文件描述符的允许范围。
EBUSY (仅限 Linux)这可能是 dup2() 在与 open() 和 dup() 的竞争条件下返回的。
EINTR dup2() 调用被信号中断。
EMFILE 进程已打开最大数量的文件描述符,并尝试打开一个新的文件描述符。

警告

newfd 超出范围时,dup2() 返回的错误与 fcntl(..., F_DUPFD, ...) 返回的错误不同。在某些系统上,dup2() 有时也会像 F_DUPFD 一样返回 EINVAL

如果 newfd 已打开,则在 close() 时可能报告的任何错误都将丢失。细心的程序员不会在不先关闭 newfd 的情况下使用 dup2()。

符合标准

SVr4、4.3BSD、POSIX.1-2001。

参见



previous next Printer Friendly

广告


  

广告



广告