重定向标准输入、标准输出、标准错误

#include <func.h>
int main(int argc , char *argv[])
{//stdin重定向
    ARGS_CHECK(argc,2);
    int fd_1=dup2(STDIN_FILENO,10);//10指向0的指向
    int fd=open(argv[1],O_WRONLY);
    ERROR_CHECK(fd,-1,"open");
    dup2(fd,STDIN_FILENO);//0指向fd的指向
    write(STDIN_FILENO,"hello\n",6);//此时hello已经被重定向到fd指向的内核缓冲区
    dup2(fd_1,STDIN_FILENO);//还原:使0指向内核的标准输入缓冲区
    close(fd);
    close(fd_1);
    return 0;
}

 

#include <func.h>
int main(int argc , char *argv[])
{//stdout重定向
    ARGS_CHECK(argc,2);
    int fd=open(argv[1],O_RDWR);
    ERROR_CHECK(fd,-1,"open");
    int fd_1=dup2(STDOUT_FILENO,10);//10指向1的指向
    printf("you can see me!");
//‘\n’能清空终端缓冲。由于终端缓冲是行缓冲,fd所指的是全缓冲,两个缓冲类型不匹配,不清空终端缓冲会有bug
    printf("\n");
    dup2(fd,STDOUT_FILENO);//1指向fd的指向
    printf("you can't see me!");//此时you can't see me已经被重定向到fd指向的内核缓冲区
    printf("\n");
    dup2(fd_1,STDOUT_FILENO);//还原:使1指向内核的标准输出缓冲
    close(fd);
    close(fd_1);
    printf("you see me!\n"); 
    return 0;
}

 

#include <func.h>
int main(int argc , char *argv[])
{//stderr重定向
    ARGS_CHECK(argc,2);
    int fd=open(argv[1],O_RDWR);
    ERROR_CHECK(fd,-1,"open");
    int fd_2=dup2(STDERR_FILENO,10);//10指向2的指向
    dup2(fd,STDERR_FILENO);//2指向fd的指向
    ARGS_CHECK(2,1);//错误信息已被重定向到fd指向的内核缓冲区
    dup2(fd_2,STDERR_FILENO);//还原:使2指向内核的标准错误缓冲
    close(fd);
    close(fd_2);
    return 0;
}

 

猜你喜欢

转载自blog.csdn.net/qq_43496435/article/details/114239039