700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 基础IO-文件描述符 重定向

基础IO-文件描述符 重定向

时间:2019-07-19 12:57:41

相关推荐

基础IO-文件描述符 重定向

目录

1.文件描述符fd

1.1 0 & 1 & 2

1.2文件描述符的分配规则

2.重定向

2.1原理

2.2使用dup2系统调用

1.文件描述符fd

1.1 0 & 1 & 2

Linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入0,标准输出1,标准错误2.

0,1,2对应的物理设备一般是:键盘,显示器,显示器。

当我们打开文件时,操作系统在内存中要创建相应的数据结构来描述目标文件,于是就有了file结构体。表示一个已经打开的文件对象。而进程执行open系统调用,所以必须让进程和文件关联起来。每个进程都有一个指针*files,指向一张表files_struct,该表最重要的部分就是包含一个指针数组,每个元素都是一个指向打开文件的指针!所以,本质上,文件描述符就是该数组的下标。所以,只要拿着文件描述符,就可以找到对应的文件

1.2文件描述符的分配规则

#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>int main(){int fd = open("myfile",O_RDWR|O_CREAT|O_TRUNC,0664);if(fd < 0){perror("open");return 1;}printf("fd: %d\n", fd);close(fd);return 0;}

输出发现,fd:3

关闭0或者2,再看

#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>int main(){close(0);//close(2);int fd = open("myfile",O_RDWR|O_CREAT|O_TRUNC,0664);if(fd < 0){perror("open");return 1;}printf("fd: %d\n", fd);close(fd);return 0;}

发现是结果是: fd: 0 或者 fd 2 ,文件描述符的分配规则:在files_struct数组当中,找到当前没有被使用的最小的一个下标,作为新的文件描述符

2.重定向

2.1原理

将原本要写入A文件的数据,在并不改变程序逻辑的情况下,写入到B文件中。

常见的重定向有:

> 清空重定向(清空要写入文件的原有内容,将数据写入到该文件中)

>> 追加重定向 (将数据追加写入到要写入文件的后面)

例:./main >/dev/null 2>&1 ——标准输出重定向到null文件,然后把标准错误重定向到标准输出

本质原理:

就是将一个描述符所对应位置的文件描述信息地址,给替换成另一个文件的描述地址,这就实现了,在不做其他逻辑改变的情况下,改变了所操作的文件

2.2使用dup2系统调用

int dup2(int oldfd, int newfd);

让newfd对应的位置,保存oldfd对应位置的信息,让new和old都指向old所代表的文件,相当于new重定向到old。

如果newfd本身代表一个已经打开的文件,则重定向前,会把对应文件关闭释放

实例:

#include <stdio.h>#include <unistd.h>#include <fcntl.h>int main(){int fd=open("./byte",O_RDWR|O_CREAT|O_TRUNC,0664);if(fd<0){perror("open error");return -1;}dup2(fd,1);//将标准输出重定向到byte这个文件char buf[1024]={0};ssize_t ret=read(0,buf,1023);//从标准输入读取数据if(ret<0){perror("read error");return -1;}printf("%s\n",buf);//将读取到的数据输出fflush(stdout);//刷新标准输出缓冲区return 0;}

从上图可以看出,原本应该输出到显示器的数据,输入到了byte文件中,这就实现了将标准输出重定向到byte文件。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。