Linux输入输出重定向

1 实验目的

理解Linux系统的输入和输出重定向是如何实现的。

学会编写简单的输入输出重定向程序

 

2 背景知识

复制一个现存的文件描述符。

#include <unistd.h>

int dup(int oldfd);

int dup2(int oldfd, int newfd);

当调用dup函数时,内核在进程中创建一个新的文件描述符,此描述符是当前可用文件描述符的最小数值,这个文件描述符指向oldfd所拥有的文件表项。

dup2和dup的区别就是可以用newfd参数指定新描述符的数值,如果newfd已经打开,则先将其关闭。如果newfd等于oldfd,则dup2返回newfd, 而不关闭它。dup2函数返回的新文件描述符同样与参数oldfd共享同一文件表项。

 

3实验内容

使用open打开一个文件data.txt用于写入,

调用dup2将得到的文件描述符复制为1,

调用printf向屏幕输入若干信息。

代码如下

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(int argc, char *argv[])
{
        int fd1;
        int fd2;

        // 打开文件
        fd1 = open("data.txt", O_CREAT|O_WRONLY, 0666);
        if (fd1 < 0){
                perror("open");
                exit(-1);
        }
        printf("fd1 ============== %d\n", fd1);

        // 通过 fd1 复制出 fd2, 最终 fd1, fd2 都指向 “1.txt”
        // 指定 fd2 的值为 1,1 原来指向标准输出设备,先 close(),再复制
        fd2 = dup2(fd1, 1);

        // 下面这句话的内容不会打印到屏幕上,而会写到文件 “1.txt” 里
        // printf()是标准库函数,最终还是会调用系统调用函数write()
        // 相当于这样,write(1,),往 1 文件描述符写内容,
        // 默认的情况下, 1 文件描述符指向标准输出设备(如,显示屏)
        // 所以, printf()的内容先显示到屏幕上
        // 但是现在 1 文件描述符指向文件 “1.txt”
        // 所以,printf()的内容会写入文件 “1.txt”
        printf("fd2 ============== %d\n", fd2);

        close(fd1);
        close(fd2);

        return 0;
}

程序结束后,使用cat命令,看看data.txt的内容。

posted @ 2020-05-21 12:27  Cool-baby  阅读(11)  评论(0编辑  收藏  举报