linux c++(IO & 第八篇 dup2|dup)
文件描述符 0标准输入、1标准输出、2标准错误输出
dup2 重定向
int dup2(int oldfd,int newfd)
关闭newfd对应的文件描述符,将newfd重新指向oldfd对应的文件
复制文件描述符
int dup(int oldfd)
新返回的文件描述符指向oldfd对应的文件
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main()
{
//先做重定向
int fd = open("word", O_WRONLY|O_CREAT,0666);
if(-1 == fd)
perror("open err");
int oldfd = dup(1);
dup2(fd,1);
printf("Hello world\n");
//需要刷新下
fflush(stdout);
dup2(oldfd,1);
printf("Hello world\n");
close(fd);
return 0;
}
实际上,调用dup(oldfd)等效于,fcntl(oldfd, F_DUPFD, 0)
而调用dup2(oldfd, newfd)等效于,close(oldfd);fcntl(oldfd, F_DUPFD, newfd);
dup()比较好了解:
系统分配一个新的、未用过的、值为最小的文件描述符指向dup()函数内的参数oldfd所指向的文件,并返回该值。
dup2()比较难理解:
1)dup2()先看看oldfd是不是一个有效的文件描述符,如果不是则调用失败,newfd文件描述符也不关闭;
2)如果oldfd是一个有效的文件描述符,则检测newfd是否被使用,如在使用,则将其关闭,并将newfd指向oldfd所指向的文件,并返回newfd;
3)如果newfd同oldfd,则不关闭该文件正常返回
浙公网安备 33010602011771号