文章目录

函数dup/dup2

  函数dup和函数dup2都用于复制一个文件描述符,其原型如下:

#include <unistd.h>

int dup(int fd);

int dup2(int fd1, int fd2);

两个函数在调用成功时都会返回一个新的描述符,若出错则会返回-1。

  对于函数dup而言,dup会返回一个当前可用描述符中最小的一个描述符,并且该描述符对应的文件与参数描述符所对应的文件一致。如,某个进程已经用掉了描述符0、1、2、6、8,然后成功调用了函数dup,参数为8,则dup一定会返回3,且描述符3对应的文件与描述符8对应的文件是同一个文件。

  对于函数dup2而言,返回的文件描述符可以由fd2来指定而不是一定返回可用最小描述符,至于参数fd1就是被复制的那个文件描述符。若指定期望返回的描述符fd2已经被打开了,则dup2就会现将其关闭;若fd2等于fd1,则dup不会关闭文件,而是直接返回fd2。

  dup和dup2成功调用后的结果可以用下图来表示:
函数dup
其中文件描述符2是复制文件描述符1的结果,1和2指向同一项文件表项。不过文件描述符2都是默认打开并与标准错误关联,所以一般直接调用dup函数是会复制失败的,可以先关闭当前的标准错误再调用dup或者直接使用dup2。

相关文章: