Linux系统调用文件操作

1 Linux的文件结构

对linux来说,一切设备都是文件,这是通过底层的设备驱动程序进行抽象的。文件除了自己所包含的内容外,还有一个名字和一些属性,如创建修改日期和它的访问权限等,这些属性被保存在文件的inode节点中,它是文件系统中一个特殊的数据块,还包含文件的长度和在磁盘上的存放位置等。OS使用的是文件的inode编号,目录结构为文件命名只是为了便于人们使用。
stat命令可以查看文件的详细信息
在这里插入图片描述

1.1 目录

目录是用于保存其它文件的节点号和名字的文件,目录文件中的每个数据项都是指向某个文件节点的链接,删除文件名就等于删除与之对应的链接。删除一个文件时,实际上是删除了该文件对应的目录项,同时指向该文件的链接数减1,如果指向某个文件的链接数为0,则该节点及其指向的数据不再被使用,磁盘上相应的位置就被标记为可用空间。
在这里插入图片描述

1.2 系统调用与库函数

我们可以通过两种方式访问文件,一种是linux的操作系统接口,即系统调用,另一种是GNU在对系统调用进行封装优化处理后的标准输入输出函数<stdio.h>。
针对输入输出操作直接使用底层系统调用时的效率很低,因为在执行系统调用函数时,Linux必须实现用户态和内核态之间的切换,这种开销是非常大的,库函数通过设置缓冲区每次读写大量数据而减少系统调用次数。
在这里插入图片描述

2 linux底层文件访问

每个进程都有一些与之关联的文件描述符,是一些小值整数,可以通过它们访问打开的文件或设备。当一个进程开始运行时,会有三个已经打开的文件描述符。当进程退出后,所有已经打开的文件描述符会自动关闭。
0:标准输入
1:标准输出
2:标准错误

2.1 write系统调用

#include <unistd.h>
size_t write(int fildes,const void* buf,size_t nbytes);

把缓冲区buf前nbytes个字节写入与文件描述符fildes关联的文件中,返回实际写入的字节数。函数返回0,则未写入任何数据,返回-1则表示在write调用中出现错误,错误代码保存在全局变量errno中。
在这里插入图片描述
在这里插入图片描述

2.2 read系统调用

#include <unistd.h>
size_t read(int fildes,void* buf,size_t nbytes);

从与文件描述符fildes相关联的文件中读入nbytes个字节的数据,并放到数据区buf中,返回实际读入的字节数,返回0表示未读入任何数据,已到达了文件尾,返回-1则表示read调用出现了错误,错误代码保存在全局变量errno中。
在这里插入图片描述
在这里插入图片描述

2.3 open系统调用

#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
int open(const char* path,int oflags);
int open(const char* path,int oflags,mode_t mode);

open系统调用创建一个新文件描述符,建立了一条到文件或设备的访问路径,返回的文件描述符唯一。当文件不存在时,文件打开失败。
oflags中必须指定文件的访问模式:
O_RDONLY只读方式,
O_WRONLY只写方式,
O_RDWR读写方式。
oflags中还可包含下列模式:
O_APPEND写入数据追加在文件尾,
O_TRUNC将文件长度设置为零,
O_CREAT按照阐述mode中设置的访问权限创建文件。
在<limits.h>头文件中的OPEN_MAX定义了可以同时打开的文件数目。
使用带O_CREAT标志的open调用来创建文件时,使用带第三个参数的open函数。文件创建时访问权限的控制,通过mode标志位进行
在这里插入图片描述
mode标志位实际上发出设置文件访问权限的请求,与用户掩码的反值做AND操作后,用于创建的文件,即在mode参数中被设置的位如果在umask值中也设置了,那么它就会从文件的访问权限中删除。

2.3.1 umask

umask是一个系统变量,当文件被创建时,为文件的访问权限设置一个掩码,umask命令可以查看该值。3个数字分别对应用户、组和其他用户的访问权限。
0:允许任何权限
4:禁止读
2:禁止写
1:禁止执行

2.4 close系统调用

#include <unistd.h>
int close(int fildes);

用close终止文件描述符fildes与其对应文件之间的关联,文件描述符被释放而能够重新使用。close调用成功时返回0,出错时返回-1。

2.5 ioctl系统调用

#include <unistd.h>
int ioctl (int fildes,int cmd, ...);

ioctl提供一个用于控制设备及其描述符行为的接口,对fildes引用的对象执行cmd参数中给出的操作,根据设备所支持的操作不同,可能会需要第三个参数。

2.6 lseek系统调用

#include <unistd.h>
#include <sys/types.h>
off_t lseek(int fildes,off_t offset,int whence);

lseek系统调用对文件描述符fildes的读写指针位置进行设置。offset参数用来指定位置,而whence参数定义该偏移值的用法,返回从文件头到文件指针被设置处的字节偏移值,失败时返回-1。

whence可以取下列值之一:
SEEK_SET:offset是一个绝对位置
SEEK_CUR:offset是相对于当前位置的相对位置
SEEK_END:offset是相对于文件尾的一个相对位置

2.7 fstat、stat和lstat系统调用

#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);

fstat返回与打开的文件描述符相关的文件的状态信息
stat和lstat返回的是通过文件名查到的状态信息,但当文件是一个符号链接时,lstat返回的是符号链接本身的信息,而stat返回的是该链接指向的文件的信息。
stat结构的成员
在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值