dup函数
头文件和函数原型:
#include <unistd.h>
int dup(int oldfd);
dup函数是用来打开一个新的文件描述符,指向和oldfd同一个文件,共享文件偏移量和文件状态。
共享偏移量代码:
int main(int argc, char const *argv[])
{
int fd = open("testDup.txt", O_RDONLY);
int copyFd = dup(fd);
//将fd阅读文件置于文件末尾,计算偏移量。
cout << "fd = " << fd << " 偏移量: " << lseek(fd, 0, SEEK_END) << endl;
//现在我们计算copyFd的偏移量
cout << "copyFd = " << copyFd << "偏移量:" << lseek(copyFd, 0, SEEK_CUR) << endl;
return 0;
}
执行结果:
fd = 3 偏移量: 75
copyFd = 4偏移量:75
返回值
返回值就是一个新的文件描述符,失败为-1。
用下图可以描述此函数的作用:
当我们调用dup(3)的时候,会打开新的最小描述符,也就是4,这个4指向了3所指向的文件,后续操作这两个中任意一个fd都有一样的效果。
dup2函数
头文件和函数原型:
#include <unistd.h>
int dup2(int oldfd, int newfd);
dup2函数,把指定的newfd也指向oldfd指向的文件,也就是说,执行完dup2之后,有newfd和oldfd同时指向同一个文件,共享文件偏移量和文件状态。
如下图,一开始我们有文件描述符3指向文件A,4指向文件B。
现在我们执行:
dup2(3, 4);
也就是我们把4也指向了3所指向的文件。如下图:
再提供一下证明共享偏移量的代码:
int main(int argc, char const *argv[])
{
int fdOld = open("testDup.txt", O_RDONLY);
int fdNew;
fdNew = dup2(fdOld, 14);
//将fd阅读文件置于文件末尾,计算偏移量。
cout << "fdOld = " << fdOld << " 偏移量: " << lseek(fdOld, 0, SEEK_END) << endl;
//现在我们计算copyFd的偏移量
cout << "fdNew = " << fdNew << "偏移量:" << lseek(fdNew, 0, SEEK_CUR) << endl;
return 0;
}
执行结果:
fdOld = 3 偏移量: 75
fdNew = 14偏移量:75
返回值
成功返回newfd,失败返回-1.
Note
在我们执行dup2之前,最好手动执行:
close(newfd);
否则,当系统执行关闭newfd再指向oldfd时,有错误发生,那么就不能成功关闭原来所指向文件B了。