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,则不关闭该文件正常返回

posted on 2021-05-03 23:53  lodger47  阅读(245)  评论(0)    收藏  举报

导航