前言
如果,想要深入的学习Linux系统调用中的dup,dup2函数,还是需要去自己阅读Linux系统中的帮助文档。
具体输入命令:
man 2 dup/dup2
即可查阅到完整的资料信息。
dup函数
dup函数是Linux系统API中的一员,它的作用是:复制一个旧的文件描述,然后在文件描述符表中找到一个最小的未被占用的文件描述符,然后创建它。新的文件描述符指向的文件描述符与旧的文件描述符相同。
它的函数原型是长这样的:
int dup(int oldfd);
接下来,我来介绍一下它的两个参数与返回值
参数:
oldfd: 旧的文件描述符。
返回值:
返回一个新的文件描述符,这个文件描述符指向原来旧的那个文件描述符指向的文件
在使用这个函数之前,我们需要往C/C++文件中导入这个头文件:
#include <unistd.h>
下面用一个代码例子来演示一下dup函数的作用:
代码实例,用新文件描述符向旧文件描述符指向的文件中写文件
// 目标:实现用新的文件描述符,往文件中写数据。
// 导入头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
int main()
{
int fd = open("a.txt", O_CREAT | O_RDWR, 0664);
if (fd == -1)
{
perror("open");
return -1;
}
// 创建一个新的文件描述符,然后让他指向旧的文件描述符指向的文件
int fd1 = dup(fd);
// 关闭旧的文件描述符
close(fd);
char *str = "hello,world";
int ret = write(fd1, str, strlen(str));
if (ret == -1)
{
perror("write");
return -1;
}
close(fd1);
return 0;
}
dup2函数
dup2函数是Linux系统API中的一员,它的作用是:将一个文件描述符指向的文件改为另一个文件描述符指向的文件。
它的函数原型是长这样的:
int dup2(int oldfd, int newfd);
接下来,我来介绍一下它的两个参数与返回值
参数:
oldfd: 是一个文件描述符,指向一个文件。
newfd:一个文件描述符,这个newfd会指向oldfd指向的文件。
返回值:
成功返回一个文件描述符,这个文件描述符指向的是oldfd指向的文件,且文件描述符的值与newfd相当。失败返回-1;
在使用这个函数之前,我们需要往C/C++文件中导入这个头文件:
#include <unistd.h>
下面用一个代码例子来演示一下dup2函数的作用:
代码演示:使用dup2函数重定位后,向重定位后的文件中写入数据。
//导入头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
int main (){
int fd = open("1.txt",O_CREAT | O_RDWR,0664); //先创建一个文件1.txt, fd -> 1.txt 。
if(fd == -1){
perror("open");
return -1;
}
int fd1 = open("2.txt",O_CREAT | O_RDWR,0664);//再创建一个文件2.txt, fd -> 2.txt 。
printf("fd的文件描述符是:%d,fd1的文件描述符是:%d\n",fd,fd1);
//fd ,fd1 分别指向两个文件, 它们互为对照组。
int fd2 = dup2(fd,fd1); // 此时,fd1指向的文件发送了变化,此时的fd1指向的是1.txt。
//fd2指向的是fd1重定位后的文件也就是1.txt。但fd1与fd2的文件描述符的值是相当的
printf("fd的文件描述符是:%d,fd1的文件描述符是:%d,fd2的文件描述符是:%d\n",fd,fd1,fd2);
char * str = "hello,world";
int ret = write(fd1,str,strlen(str));
if(ret == -1){
perror("write");
return -1;
}
close(fd);
close(fd1);
//这个操作是在向1.txt中去写文件,但是由于fd2与fd1的文件描述符是其实是一样的,所以说关闭了fd1相当于关闭了fd2
//此次操作不生效。
char * str1 = "good,day";
int ret1 = write(fd2,str1,strlen(str1));
if(ret1 == -1){
perror("write");
return -1;
}
}