目录
一、文件描述符
文件IO中已打开文件的标志
非负整数
当前可用最小作为打开文件的描述符
默认一个进程同时最多打开1024个描述符(0 ~ 1023)
二、基本IO函数
1、打开文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
pathname:打开路径
flags:打开模式 C语言open()函数:打开文件函数
mode:若打开的文件不存在并创建时,mode赋予新文件权限,mode的值会受到umask值的影响 【umask】关于umask值及其对应的文件权限
返回值:文件描述符
2、读取文件
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
fd:文件描述符
buf:读到的数据存放的地址
const:要读取的字节数
返回值:读取成功返回读到的字节数,读取失败返回-1,若已经读到了文件末尾,则返回0
3、写文件
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
fd:文件描述符
buf:要写入的数据的地址
const:写入的字节数
返回值:顺利写入返回写入的字节数,错误返回-1.错误代码存入error中
4、改变文件偏移量
每一个打开的文件都有一个与之相关的文件偏移量,第一次打开时默认在文件头,读、写操作都从当前文件偏移量处开始。
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
fd:文件描述符
offset:相对于whence(基准)的偏移量
whence:SEEK_SET(文件指针开始),SEEK_CUR(文件指针当前位置) ,SEEK_END(文件指针末尾)
5、关闭文件
#include <unistd.h>
int close(int fd);
fd:文件描述符
三、文件共享
文件共享指的是多个进程同时对同一个文件进行操作,此时我们需要了解三张表结构
进程表项 | 每一个进程拥有一张进程表项,主要包含fd标志和文件表指针 |
文件表 | 每打开一次就会建立一个文件表结构,主要包含文件偏移量,打开方式和v节点表指针 |
v节点表 | 每一个文件对应一张v结点表,主要包含文件的属性和内核io操作函数地址 |
四、文件重定向
在默认情况下,0、1、2号文件描述符分别对应 标准输入、标准输出、标准错误输出
#include <unistd.h>
int dup(int oldfd);
int dup2(int oldfd, int newfd);
oldfd:需要重定向的文件的文件描述符
newfd:新的文件描述符
1、dup:. 使用当前可用文件描述符中最小的作为oldfd复制
2、dup2:使newfd作为oldfd的复制,如果newfd已占用,首先会关闭newfd文件