10.7 I/O重定向

I/O重定向

shell提供了I/O重定向的操作符,可以将文件和标准的输入输出联系起来

$ ls > foot.txt  把ls执行结果(标准输出)重定向到foot.txt文件中

注意:

  • 截断模式(先清空文件,再写入内容)

  • 追加模式(直接追加到文件的尾部)

  • < 读取文件内容到stdin(0)

在shell中创建一个自定义文件描述符用于写入(追加模式):

$ exec 5>>input.txt 

dup2函数

#include <unistd.h>
int dup2(int oldfd, int newfd) 

dup2函数的功能为:
拷贝描述符表表项oldfd到描述符表项newfd,覆盖newfd,如果newfd已经打开,则先关闭

比如:
dup2(4,1) 则是把描述符表项4复制到1(标准输出),那么写到标准输出的任何数据都 写到到文件描述符4指向的文件中(因为1和4的描述表表项相同,而且1的已经打开的文件在复制之前就已经关闭,所以两个都指向同一个文件表项)

练习题10.4:

如何用dup2将标准输入重定向到描述符5?  
dup2(5,0)

练习题10.5:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
int main()
{
    int fd1,fd2;
    char c;
    fd1 = open("footbar.txt",O_RDONLY,0);
    fd2 = open("footbar.txt",O_RDONLY,0);
    read(fd2, &c, 1); //读取一个字符
    dup2(fd2,fd1);  //fd1复制了fd2的描述符表项,fd1,fd2拥有同一个文件位置
    read(fd1, &c, 1);  //继续读取一个字符
    printf("c=%c\n", c); //0
    exit(0);
}