今天我们介绍经常用的两个函数,这两个函数在做读写重定向和文件共享的时候是非常有用的他们就是dup和dup2
int dup( int oldfd );
int dup2( int oldfd, int targetfd );
oldfd:要被复制的文件描述符
newfd:在dup2函数中指定的新文件描述符
返回值:调用成功返回新的文件描述符,调用失败返回 -1
首先我们来先看下dup的用法,一般我们打开相同的文件的时候我们的读写指针不是共享的,但是使用dup之后可以共享读写指针。
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define file "demo3.txt"
int main(int argc, char *argv[])
{
int fd1, fd2, fd3;
char cmd[] = "cat " file "; echo";
fd1 = open(file, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
if (fd1 == -1)
{
printf("open file2 failed\n");
}
fd2 = dup(fd1); //共享fd1的读写指针
if (fd2 == -1)
{
printf("open file2 failed\n");
}
fd3 = open(file, O_RDWR);
if (fd3 == -1)
{
printf("open file2 failed\n");
}
printf("%d %d %d\n",fd1,fd2,fd3 );
if (write(fd1, "Hello,", 6) == -1)
{
printf("write file1 failed\n");
}
system(cmd);
if (write(fd2, " world", 6) == -1)
{
printf("write file2 failed\n");
}
system(cmd);
if (write(fd3, "Gidday", 6) == -1)
{
printf("write file3 failed\n");
}
system(cmd);
close(fd1);
close(fd2);
close(fd3);
return 0;
}
结果:
3 4 5
Hello,
Hello, world
Gidday world
dup2一般用于重定向文件操作
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
int main()
{
int fd1,fd2;
fd1 = dup(STDOUT_FILENO); //用fd1保存标准输出
fd2 = open("demo3.txt",O_CREAT | O_RDWR | O_APPEND);
if (-1 == fd2)
{
printf("open file error.\n");
return -1;
}
if (-1 == dup2(fd2,STDOUT_FILENO) ) {//将fd2映射到标准输出
printf("dup2 file error.\n");
return -1;
}
write(STDOUT_FILENO,"hello fd2\n",10);//这里写入标准输出,会输入的文件里
write(fd2,"hello Im fd2\n",15);//这也是项文件里写入
if (-1 != dup2(fd1,STDOUT_FILENO) ) {//将标准输入恢复成与原来的状态
write(STDOUT_FILENO,"normal\n",7);
}
close(fd2);
}