dup介绍

  • dup的函数声明如下

    1
    2
    #include <unistd.h>
    int dup(int oldfd);
  • dup系统调用函数会创建一个文件描述符oldfd的拷贝,具体而言,dup会从低位开始寻找一个unused fd作为拷贝的fd。

  • 成功返回后,oldfd and newfd may be used interchangeably,意思是两个文件描述符在某种意义上是一致的(或者说在使用上是可互换的),他们refer to相同的open file description,具有一致的文件偏移量和文件状态标志(file offset and file status flags);但两者并不共享文件描述符标志(file descriptor flags)。

dup2介绍

  • dup2的函数声明

    1
    2
    #include <unistd.h>
    int dup2(int oldfd, int newfd);
  • dup2与dup类似,区别在于并不从最低位开始寻找unused fd,而是使用参数制定的newfd。

  • 如果newfd已经打开,那么首先会close然后reuse,注意这一过程必须是原子的。例如如果用close加dup来实现这一过程可能会存在数据竞争的情况,在close和dup之间newfd被复用。

  • 如果oldfd不是合法的文件描述符,系统调用会失败,并且newfd不会close;如果oldfd是合法文件描述符,但newfd与oldfd的值相同,那么dup2系统调用什么都不会做并且返回newfd。

关于返回值

  • 如果dup和dup2执行成功,则函数返回值为newfd的值,若失败则返回-1。