Linux内核文件系统的底层调用

底层系统调用

open系统调用

​ open可以创建一个新的描述符,成功返回文件描述符,失败返回-1,通常open系统调用不需要头文件sys/stat.hsys/types.h但在某些UNIX系统上,它们必不可少,如果两个程序同时打开一个文件,它们会分别得到两个不同的文件描述符。如果它们都对文件进行写操作,那么它们会各写各的,分别接着上次离开的位置继续往下写。数据不会交织,而是彼此覆盖。两个程序对文件读写位置(偏移值)不同。可以通过使用文件锁防止这种现象出现。

​ O_APPEND:把写入数据追加在文件末尾;

​ O_TRUNC:把文件长度设置为0,丢弃已写内容;

​ O_CREAT:如果需要,就按参数mode中给出的访问模式创建文件;

​ O_EXCL:与O_CREAT一起使用,确保调用者创建出文件。OPen调用是一个原子操作,也就是说,它只执行一个函数调用。使用这个可选模式可防止两个程序同时创建一个文件。

​ S_IR(orW\X)USR 创建者权限

​ S_IR(orW\X)GRP用户组权限

​ S_IR(orW\X)OTH其他人权限

#include"fcntl.h"
#include"sys/types.h"
#include"sys/stat.h"

int open(const char *path ,int oflag);		//path是文件路径,oflag通过必需文件访问模式和其他可选模式相结合的方式来指定
int open(const char *path ,int oflag,mode_t mode);	//mode参数在头文件"sys/stat.h"中定义用于和O_CREAT联合使用创建文件

文件描述符" 0 & 1 & 2 " 及 " 分配规则 "

Linux 进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入 0, 标准输出 1, 标准错误 2
对应的物理设备一般是:
标准输入 0 —> 键盘
标准输出 1 —> 显示器
标准错误 2 —> 显示器

文件描述符的分配原则是从未分配的最小的描述符开始分配

write系统调用

​ 系统调用write的作用是把缓冲区的buf的前nbytes个字节写入文件描述符关联的文件中,它返回实际写入的字节数。如果文件描述符有误或者设备驱动程序对数据块长度比较敏感,该返回值可能会小于nbytes。函数为0,就表示未写入任何数据;如果它返回的是-1,就表示在write调用中出现了错误;错误代码保存在全局变量errno中;

#include"unistd.h"

size_t write(int fildes,const void * buf ,size_t nbytes)

read系统调用

​ read的作用是:从与文件描述符fildes相关联的文件里读入nbytes个字节的数据,并把它们放到数据区buf中。它返回实际读入的字节数,这可能会小于请求的字节数。返回-1表示调用出现错误。

#include"unistd.h"

size_t read(int fildes,const void * buf ,size_t nbytes)

close系统调用

​ close调用用于终止文件描述符fildes与其对应文件之间的关联,文件描述符释放可以重新使用,检查close调用的返回结果十分重要,有的文件系统,特别是网络文件系统,可能不会在关闭文件前报告写操作出现的错误,这是因为在执行写操作数字未被确认写入。

ioctl系统调用

​ ioctl调用是个大杂烩,它提供了控制设备及其描述符行为和配置底层服务的接口。终端、文件描述符、套接字都可以有为它们定义的ioctl,具体细节可以参考设备手册,ioctl调用

lseek系统调用

​ lseek系统调用对文件描述符fildes的读写指针进行设置,也就是说,你可以用它来设置文件的下一个读写位置,可以设置为,文件中的某个绝对位置相对位置或者文件尾的某个相对位置

#include"unistd.h"
#include"sys/types.h"

off_t lseek(int fildes ,off_t offset ,int whence);

​ offset参数用来指定位置,而whence参数定义该偏移值的用法。whence可以取下列值之一

  • SEEK_SET:offset是绝对位置;
  • **SEEK_CUR:**offset是相对当前位置的一个相对位置;
  • **SEEK_END:**offset是相对于文件尾的一个相对位置。

lseek返回从头文件到头指针被设置处的字节偏移值,失败时返回-1,参数offset的类型off_t是一个与具体实现有关的整形,定义在sys/types.h中

fstat、stat和lstat系统调用

​ fstat系统调用返回与打开的文件描述符相关的文件的状态信息,该信息将会写到一个buf结构中,buf的地址以参数的形式传递给fstat

#include"unistd.h"
#include"sys/stat.h"
#include"sys/types.h"

int fstat(int fildes,struct stat *buf);
int stat(const char *path,struct stat *buf);
int lstat(const char *path, struct stat *buf);

​ stat和lstat是通过文件名查到的状态信息,结果相同,但如果文件是一个链接时,lstat返回的是该符号链接本身的信息,stat返回是该链接指向文件的信息。

dup和dup2系统调用

​ dup系统调用提供了一种复制文件描述符的方法,使我们能够通过两个或者更多个不同的描述符来访问同一个文件,这可以同时在文件不同位置对数据进行读写,dup系统调用复制文件描述符fildes,返回一个新的描述符。dup2系统调用则是明确指定目标描述符来把一个文件描述符复制为另一个。

#include"unistd.h"

int dup (int fildes);
int dup2 (int filde,int fildes2);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值