目录
文件重定向。
dup
文件描述符拷贝。 使用现有的文件描述符,拷贝生成一个新的文件描述符,且函数调用前后这个两个文件描述符指向同一文件。 后续作保存使用。
man 2 dup
参数oldfd
已有文件描述符。
返回值
新的文件描述符。
测试代码1
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{
int fd = open(argv[1], O_RDWR); //得到一个文件描述符
int fd1 = dup(fd); //文件描述符拷贝
printf("fd=%d\n", fd);
printf("fd1=%d\n", fd1);
close(fd);
close(fd1);
return 0;
}
测试结果
dup2
文件描述符拷贝。重定向文件描述符指向。 通过该函数可实现命令行“重定向”功能。使得原来指向某文件的文件描述符,指向其他指定文件。
man 2 dup2
参数oldfd
已有的文件描述符。
参数newfd
待重定向文件描述符。
返回值
成功:newfd
失败:-1
测试代码2
读取两个文件,修改第2个文件描述符的重定向到第1个文件描述符,再向第2个文件描述符写入内容,修改1的文件描述符重定向到第1个文件,终端输出内容。
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{
int fd1 = open(argv[1], O_RDWR);
int fd2 = open(argv[2], O_RDWR);
int flag;
flag= dup2(fd1, fd2); //fd2文件描述符重定向到fd1文件描述符
flag=write(fd2,"hello world!",12);
if(flag<0){
perror("write error");
}
dup2(fd1,STDOUT_FILENO); //终端输出重定向到fd1
printf("\n你好,世界!\n");
close(fd1);
close(fd2);
return 0;
}
测试结果
测试代码3
通过fcntl实现dup的功能。
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{
int fd1 = open(argv[1], O_RDWR);
printf("fd1:%d\n", fd1);
int fd2=fcntl(fd1,F_DUPFD,0); //已被占用的文件描述符,返回最小可用的
printf("fd2:%d\n",fd2);
int fd3=fcntl(fd1,F_DUPFD,7); //未被占用的文件描述符,返回该值
printf("fd3:%d\n",fd3);
close(fd1);
close(fd2);
close(fd3);
return 0;
}