【进程OI】基本文件操作的系统调用

简介: 【进程OI】基本文件操作的系统调用

前言

当用户想要向磁盘中的文件读写数据,就必须要得到操作系统的允许。同样,操作系统为了能让用户去对文件进行打开、读写、关闭等操作,向上提供了相应的系统调用的接口。C、JAVA、C++等语言它们对这些系统调用进行了封装,虽然各个函数看起来不一样,但是本质是都是在使用操作系统提供的系统调用。

接下来,我们来介绍这些系统调用的接口。

open

用于打开一个文件,并返回一个文件描述符。open()系统调用可以指定文件名、访问模式(读、写、追加等)以及权限等参数。

open函数可以以flag的方式打开某个文件,如果文件不存在,就会创建一个新的文件。

pathname表示文件的路径名,也可以是一个文件名,这样会默认在当前进程路径下打开或者创建。

flags表示打开文件的方式选项,参见选项有:

O_WRONLY:只写打开

O_CREAT:文件不存在时创建文件

O_RDONLY:只读打开

O_RDWR:读写方打开

O_APPEND:追加方式打开

O_TRUNC:清空文件,重新写入

参数mode表示的是创建文件时的初始化权限编码(会被umask影响)。

参数flags

参数flags可以允许选项多个组合搭配。例如O_WRONLY|O_CREAT|O_TRUNC表示的就是:以写的方式打开,如果之前文件不存在,则创建文件,并且打开文件后清空文件中的所有内容。相当于C语言中的w文件操作。

为什么这些选项用或|起来就能实现组合呢?

参数int flags表示的实际上是一个32位二进制的位图,位图(Bitmap)是一种基于位操作的数据结构,用于表示一组元素的集合信息。位图中的每个二进制位都表示着某个元素是否在集合中。当然实际上可能不会用到这么多位。

比如宏O_WRONLY假设表示的是2即10(二进制),O_CREAT表示4,即100(二进制)。那么O_WDONLY|O_CREAT=110(二进制)。在open函数内部就会有相应的机制监测flags的二进制位哪些是1,再分别对应其代表的功能。

参数mode

mode参数表示的是四个八进制位的数,一般取后三位表示文件的权限.例如0666,取666用二进制表示的就是110 110 110分别对应文件的拥有者、所属组、其他人的权限。

如果没有设置mode,那么创建出来的文件权限可能就会出现问题。

例如我们用以下代码创建一个原本不存在的文件

结果文件权限都出现了乱码。

所以一般我们要创建新文件的时候,都需要带上mode参数。

于是我们删掉log.txt文件,再加上参数mode:

mode=0666。新建出来的文件权限就变成了rw-rw-r--对应的权限编码为664.这是因为我们的umask默认为002,也就是过滤掉了“其他人”的w权限,所以得到的最终文件权限编码是664

write

用于向文件中写入数据。通过指定文件描述符、数据来源的缓冲区地址和要写入的字节数,可以将数据写入到文件中。如果写入失败则返回-1,否则返回写入的字节数;

fd表示的是文件标识符

buf表示的是数据的地址

count表示的是字节数

ssize_t类型表示有符号整型,输出格式为%ud.

read

用于从文件中读取数据。通过指定文件描述符、缓冲区地址和读取的字节数,可以将文件中的数据读取到缓冲区中。读取成功返回读取的字节数,否则返回-1.

fd表示文件标识符

buf表示数据从文件中输出到的地址

count期望要读取的字节数

close

用于关闭一个文件描述符,释放系统资源。在文件操作完成后,应该及时关闭文件描述符,以防资源泄漏。关闭成功返回0,否则返回-1.

相关文章
|
2月前
|
Unix Linux C语言
【进程OI】重定向的本质&&用户级缓冲区
【进程OI】重定向的本质&&用户级缓冲区
|
2月前
|
算法 Unix Linux
进程原理及系统调用
进程原理及系统调用
|
7月前
|
Linux 调度 Windows
【Linux系统化学习】探索进程的奥秘 | 第一个系统调用
【Linux系统化学习】探索进程的奥秘 | 第一个系统调用
|
8月前
|
程序员 Linux Shell
【CSAPP】进程控制 | 系统调用错误处理 | 进程状态 | 终止进程 | 进程创建 | 回收子进程 | 与子进程同步(wait/waitpid) | execve 接口
【CSAPP】进程控制 | 系统调用错误处理 | 进程状态 | 终止进程 | 进程创建 | 回收子进程 | 与子进程同步(wait/waitpid) | execve 接口
75 0
|
Unix Shell Linux
进程系统调用
进程系统调用
75 0
|
Unix Linux
进程原理及其系统调用(下)
进程原理及其系统调用
66 0
|
算法 Linux 调度
进程原理及其系统调用(上)
进程原理及其系统调用
106 0
|
Shell Linux C语言
【Linux进程】三、进程控制——fork()系统调用深度刨析
【Linux进程】三、进程控制——fork()系统调用深度刨析
252 0
【Linux进程】三、进程控制——fork()系统调用深度刨析
|
Linux C语言
Linux系统调用一、系统调用与C库函数的关系 —— 从进程虚拟地址空间和文件描述符的角度分析
Linux系统调用一、系统调用与C库函数的关系 —— 从进程虚拟地址空间和文件描述符的角度分析
182 0
Linux系统调用一、系统调用与C库函数的关系 —— 从进程虚拟地址空间和文件描述符的角度分析
|
存储 消息中间件 算法
操作系统学习笔记_2 中断和系统调用;进程和线程
学习自计算机科学单本&b站王道课程。
134 0
操作系统学习笔记_2 中断和系统调用;进程和线程