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