沉下心学操作系统(四)关于文件

文章目录

      • 文件描述符
      • 关于I/O的系统调用函数
        • open()
        • dup2()
        • dup()
        • read()、write()
        • lseek()
        • fsync()
        • close()

文件描述符

​ 每个进程控制块都有一个文件描述符表,可以把它看作一个数组,里面存储指向以打开文件地址的指针,这个数组的下角标就是文件描述符。每次open都会把新打开的文件地址存储到表中的某个空行,并返回下角标作为文件描述符。

​ 其中0~2为特殊的文件描述符,分别为标准输入,标准输出,标准错误输出,这三个文件描述符在进程初始时自动打开,其中标准输出就是printf输出的对象

关于I/O的系统调用函数

open()

#include 
#include 
#include 
int open(const char* pathname, int flags, mode_t mode);

​ 相比fopen()处于系统的更低层,可以对文件进行更基础的操作,但是也失去了一些库函数的帮助

​ 参数分别是被打开文件路径、进行的操作、创建文件时的使用权限(可省略)

​ 它的返回值为文件描述符

dup2()

#include 
int dup2(int oldfd, int newfd);

​ 该函数可以使newfd指向oldfd指向的文件

dup()

#include 
int dup(int oldfd);

​ 该函数会选择最小的空闲文件描述符让它指向oldfd,并返回新的指向该文件的描述符

read()、write()

#include 
ssize_t read(int fd, void* buf, size_t count);
ssize_t write(int fd, const void* buf, size_t count);

​ 参数分别为文件描述符,写入/读入的内容,写入/读入的最大长度。若调用成功返回实际读写的长度,否则返回-1

lseek()

#include 
#include 
off_t lseek(int fd, off_t offset, int whence);

​ 参数分别为文件描述符,移动的长度,移动目标的起点。whence有3个常用值,SEEK_SET,SEEK_END,SEEK_CUR,分别代表开头,结尾和当前位置

fsync()

int fsync(int fd);

​ 由于向磁盘写入数据很花时间,因此内核为了提高效率会推迟写入数据。而fsync()可以同步内存中所有已修改的文件写入到储存设备

close()

int close(int fd);

​ 用于关掉文件,fd为文件描述符

转载请注明出处!!!

如果有写的不对或者不全面的地方 可通过主页的联系方式进行指正,谢谢

你可能感兴趣的:(操作系统,面试)