打开文件(open函数)
-
任何一个进程在运行时都会默认打开三个文件
- 标准输入stdin(键盘)
- 标准输出stdout(显示器)
- 标准错误stderr(显示器)
open函数原型
- pathname :要打开的文件路径。
- mode :指定要用什么权限打开文件。
- 返回值 :打开失败则返回 -1,打开成功则返回一个文件描述符。
int open(const char *pathname, int flags); //用于打开已经存在的文件
int open(const char *pathname, int flags, mode_t mode); //用于打开不存在的文件
文件权限mode
-
创建文件时,mode用于设定新文件的权限。
- 该权限是以权限编码值来设定的(例如设置为 0666 )
- 该权限受权限掩码umask的限制。
flags属性详解
-
打开文件的方式:
- O_RDONLY :表示以只读方式打开。
- O_WRONLY :表示以只写方式打开。
- O_RDWR :表示以可读可写方式打开。
-
写入数据的方式:
- O_APPEND :写入数据时,以在末尾追加的方式写入。
- O_TRUNC :写入数据时,以覆盖的方式写入(即先删除原数据,再写入)
- 如果同时使用 :O_TRUNC起作用
- 同时不使用 :原文件内容不变(不读不写)
-
打开不存在的文件时:
- O_CREAT :打开不存在的文件时,会在当前路径自动创建这个文件,如果文件存在,则会先删除这个文件再创建文件。
- 所谓当前路径是指进程启动时所处的路径,而不是程序文件所存在的路径。
读文件(read)
函数原型
- fd :文件描述符
- buf :存放读取的数据
- count:期望读取的字节数
- 返回值是实际读取的字节数。
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
写文件(write)
函数原型
- fd :文件描述符
- buf :需要写入的内容
- count:期望写入的字节数
- 返回值是实际写入的字节数。
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
C语言中的fopen、fwrite、fread
- c语言中的文件函数fopen等,其底层都是调用系统的open函数等。
- 并且 fopen 等返回值为文件指针, open 返回值是文件描述符(int类型)
- 这样实现一种语言上的封装,实现跨平台性。
文件描述符
- 在系统中任何时刻都存在大量的已经打开的文件。
- 磁盘文件中存储的不只是文件内容,还包括文件属性
- 内存文件中存储的更多是文件属性,文件内容是缓慢的从硬盘文件中加载的。
-
系统分配文件描述符的方法:
- 当前已经使用的文件描述符不会再次被分配,新分配的文件描述符的值是系统中未被分配的文件描述符的值中最小的一个。
文件描述符的意义
- 每个进程中都存在一个进程控制块PCB
- 这个PCB的结构体task_struct中存在一个文件结构体 files_struct
- 这个文件结构体中存在一个用来存在文件指针的数组 struct file* fd_array [ ]
- 运行进程,打开文件后,就会将文件的指针存放在这个数组中
- 所谓的文件描述符则是对应文件在数组中的下标。
- 因为进程的独立性,在这个进程中将文件关闭,对其他进程没有影响。
复制文件描述符
dup函数介绍
- 调用dup函数对文件描述符fd1进行复制,会返回一个新的文件描述符(注意:这个新的文件描述符fd2 在数值上不等于 fd1,但是它们都指向同一个文件)
- 使用dup复制时,这个新的文件描述符 fd2 的值是无法自己指定的,是由操作系统内部分配的。
#include <unistd.h>
int dup(int oldfd);
//fd2 = dup(fd1);
dup2函数介绍
- 使用dup2 复制时,这个新的文件描述符的值是可以自己指定的。
- fd1 是原来的文件描述符的值,16 是人为指定新的文件描述符。
- 如果正确,返回值fd2 就是16,如果错误,返回值fd2 就是 -1。
#include <unistd.h>
int dup2(int oldfd, int newfd);
//fd2 = dup2(fd1, 16);
命令行中的重定向( > )
- Linux中的shell命令执行后,打印结果都是默认进入标准输出的(因为这些命令都是调用printf打印的),所以我们可以直接在Linux终端看到命令执行的结果。
-
命令行中的重定向 > 的作用:
- 将命令行中命令执行的结果指定输出到某一个文件中。
- 例如:将ls命令的输出结果重定向到 1.txt 文件中去(注意是在终端命令行中输入下列命令)
ls > 1.txt
-
重定位命令 > 的原理就是利用close + dup
- open打开文件 1.txt ,然后 close 关闭 stdout(标准输出),因为标准输出的文件描述符的值是1,然后利用dup2 将文件描述符1 和 1.txt文件关联起来。
相关文章
暂无评论...