1、cat file1 > file2 将file1中的内容复制到file2中。
2、dup/dup2
如果两个文件描述符指向同一个file结构体,file结构体只有一份FILE STATUS FLAG和文件位置。
如果用open函数两次打开同一个文件那么得到的文件描述符不同,每个文件描述符指向的file结构体也不同,因此包含了不同的FILE STATUS FLAG和文件位置。
dup函数
所需头文件:#include<unistd.h>
函数原型:int dup(int oldfd)
oldfd :已经打开的文件的文件描述符
返回值:成功时返回新的文件描述符,失败时返回-1并设置errno。
用法:s_fd =
dup(int oldfd); //返回一个新的文件描述符,这个文件描述符是没有用到的最小的文件描述符,这个文件描述符与oldfd共享一个文件表项。
-
#include <unistd.h>
-
#include <stdio.h>
-
#include <string.h>
-
#include <fcntl.h>
-
#include <stdlib.h>
-
int main()
-
{
-
int fd, copy_fd, res;
-
-
char buf1[] = "abd";
-
char buf2[] = "wwww";
-
char buf3[10] = {0};
-
-
memset(buf3, '\0', 10);
-
-
fd = open("./test.txt", O_RDWR | O_CREAT);
-
printf("fd = %d\n", fd);
-
copy_fd = dup(fd);
-
printf("copy_fd = %d\n", copy_fd);
-
-
while(1)
-
{
-
res = write(fd, buf1, 3);
-
if(res == -1)
-
{
-
perror("fail to write\n");
-
exit(1);
-
}
-
-
else if(res == 3)
-
break;
-
}
-
lseek(fd, 0, SEEK_SET);
-
while(1)
-
{
-
res = read(fd, buf3, 3);
-
if(res == -1)
-
{
-
perror("fail to write\n");
-
exit(1);
-
}
-
else if(res == 3)
-
break;
-
}
-
printf("----%s\n", buf3);
-
close(fd);
-
close(copy_fd);
-
return 0;
-
}
编译之后执行,结果为:
fd = 3
copy_fd = 4
----abd
由copy_fd = 4可看出dup返回的是没有用到的最小的文件描述符。
copy_fd = dup(fd);使得copy_fd 与fd指向同一个文件,通过fd向文件写入abc,通过copy_fd从文件读取的结果也是abc。
使用dup函数之前,用open函数打开一个文件,文件描述符为fd =3
使用dup函数 copy_fd = dup(fd);效果如下:
dup2函数
所需头文件:#include<unistd.h>
函数原型:int dup2(int oldfd, int newfd)
oldfd :已经打开的文件的文件描述符
newfd: 指定返回的文件描述符
返回值:成功时返回newfd的文件描述符,失败时返回-1并设置errno。
用法:
s_fd = dup(int oldfd,int newfd); //s_fd等于newfd的值,解除newfd/s_fd的文件表指针与文件表的关联,newfd/s_fd 与oldfd共享一个文件表项。
用一个例子解释:
-
#include <unistd.h>
-
#include <stdio.h>
-
#include <string.h>
-
#include <fcntl.h>
-
#include <stdlib.h>
-
int main()
-
{
-
int new_fd, old_fd, copy_fd, res;
-
char buf1[] = "abd";
-
char buf2[] = "wwww";
-
char buf3[10] = {0};
-
memset(buf3, '\0', 10);
-
new_fd = open("./test.txt", O_RDWR | O_CREAT);
-
printf("new_fd = %d\n", new_fd);
-
old_fd = open("./test1.txt", O_RDWR | O_CREAT);
-
printf("old_fd = %d\n", old_fd);
-
-
copy_fd = dup2(new_fd, old_fd);
-
printf("copy_fd = %d\n", copy_fd);
-
-
while(1)
-
{
-
res = write(new_fd, buf1, 3);
-
if(res == -1)
-
{
-
perror("fail to write\n");
-
exit(1);
-
}
-
else if(res == 3)
-
break;
-
}
lseek(copy_fd, 0, SEEK_SET);
while(1)
{
res = read(old_fd, buf3, 3);
if(res == -1)
{
perror("fail to write\n");
exit(1);
}
else if(res == 3)
break;
}
printf("----%s\n", buf3);
close(new_fd);
close(copy_fd);
return 0;
}
编译之后执行,结果为:
new_fd = 3
old_fd = 4
copy_fd = 4
----abd
可以看出使用了copy_fd = dup2(new_fd, old_fd);copy_fd 与old_fd大小相等。
通过copy_fd 、new_fd、old_fd操作的是同一个文件。
使用dup2之前用open函数打开两个文件文件描述符分别为 3、4对应图如下:
阅读(932) | 评论(0) | 转发(0) |