重定向之dup,dup2

dup函数的作用:复制一个现有的句柄,产生一个与“源句柄特性”完全一样的新句柄(也即生成一个新的句柄号,并关联到同一个设备)

dup2函数的作用:复制一个现有的句柄到另一个句柄上,目标句柄的特性与“源句柄特性”完全一样(也即首先关闭目标句柄,与设备断连,接着从源句柄完全拷贝

使用场景:
在Linux命令行输入ls > a.txt, 这里就用了dup,将原本输出在屏幕上的文字重定向到file文件中(如果没有 a.txt文件则创建之)

#include 

int dup(int oldfd);
int dup2(int oldfd, int newfd);

//STDIN_FILENO标准输入描述符(0)
//STDOUT_FILENO标准输出描述符(1)
//STDERR_FILENO标准错误描述符(2)

dup(fd)是对fd进行一份拷贝,将当前最小未被使用的文件描述符返回。
dup2(fd)则是对fd进行拷贝,返回指定参数newfd,如果newfd已经打开,则先将其关闭。

实现重定向

重定向之dup,dup2_第1张图片

我们需要先关闭指向stdout的那个指针,然后让1这个位置的指针指向file,这样子当我们使用printf之类的函数,输出就显示到file文件中而非stdout文件。

dup的使用:

#include
#include
#include
#include
//系统调用 dup() 和 dup2() 都能够复制文件描述符
//dup返回新的文件描述符,成功时返回最小的尚未被使用的文件描述符
//dup2可以让用户指定返回的文件描述符的值,它通常用来重新打开或者重定向一个文件描述符

int main()
{
    int fd=open("./log",O_CREAT | O_RDWR);//获取 "./log" 的文件描述符fd ,此时为3。
     printf("fd:%d",fd);
    if(fd<0)
    {
        perror("open()");
        return fd;
    }

    close(1);//关闭想要重定向的文件描述符,此时为1.
    int new_fd=dup(fd);//拷贝fd(3)到当前最小未被使用的文件描述符(1),返回1.                  

     printf("new_fd:%d",new_fd); //new_fd值为1.
    if(new_fd==-1)
    {
        perror("dup()");
        return -1;
    }
    close(fd);
    char buf[1024];
    while(1)
    {
        memset(buf,'\0',sizeof(buf));
        fgets(buf,sizeof(buf),stdin);
        if(strncmp("quit",buf,4)==0)
        {
            break;
        }
        printf("%s",buf);
        fflush(stdout);
    }
    close(new_fd);

    return 0;
}

dup2的使用:

题 ##

#include
#include
#include
#include

int main()
{
    int fd=open("./log2",O_CREAT | O_RDWR); //fd的值为3
    if(fd<0)
    {
        perror("open()");
        return -1;
    }
    close(1);
    int new_fd=dup2(fd,1); //new_fd值为1
    if(new_fd==-1)
    {
        perror("dup2()");
        return 2;
    }

    char buf[1024];
    while(1)
    {
        memset(buf,'\0',sizeof(buf));
        fgets(buf,sizeof(buf),stdin);
        if(strncmp("quit",buf,4==0))
        {
            break;
        }
        printf("%s",buf);
        fflush(stdout);
    }
    close(fd);
    return 0;
}

你可能感兴趣的:(重定向之dup,dup2)