学习Linux系统编程-Day(7)

1.之前已经提到过,在Linux系统的设计哲学中有“万物皆文件”的法则,而Linux系统本身也提供了一整套面向文件的通用编程接口,这部分是通用的接口,可以运行在很多场景下,前提是确保每一个文件系统和设备驱动程序都实现了I/O系统调用集

2.Linux系统内对每个文件都是以文件描述符(file descriptor)的形式来标识的,每一个文件描述符(通常是一个较小的正整数)都描述了一个打开的文件。一般来说,大多数程序都会使用标准输出流标准输出流标准错误流这三个文件(描述符),所以这几个描述符都是自动由shell预置打开的,它们的编号依次是0 1 2。重定向时shell会对文件描述符做一些修改然后再启动程序。

注意freopen()函数,它的作用是重定向,比如说我们可以把stdout从终端重定向到一个文件,这样程序的输出结果就会在文件中打印出来。使用freopen()函数之后,文件描述符就不能确定还是原先的1了,可能会变成其他值,这个值由内核指定。
在这里插入图片描述
3.四种基本的系统调用:open,read,write,close。open作用是打开或创建文件,本质就是向内核申请一个新的文件描述符来访问pathname指向的文件并在进程的文件描述符表中注册;read,write分别用来读写特定数量的文件数据到缓冲区中,返回值均为访问到的数据字节数;close作用是关闭文件,本质就是向内核归还文件描述符并释放资源。

下面对这几种系统调用作详细的解释:
3.1 open系统调用
既可以打开一个已经存在的文件,也可以创建一个新的文件。其函数原型如下:
在这里插入图片描述
要使用open系统调用,必须添加头文件<fcntl.h>。pathname指向要打开的文件,这里的文件是广义上的文件,比如我们可以令pathname=“/dev/mem”来指向计算机的物理内存,进而开启内存映射等操作。flags是指定访问模式的位掩码,可以是任意以下参数的逻辑或结果
在这里插入图片描述
在这里插入图片描述
大致可以按照功能将flags关键字分为3类,分别是:文件访问模式文件创建标志已打开文件的状态标志

注意函数原型的最后是C语言可变参数列表…,这表示后面可能存在更多参数(这些参数会用va_list收集,属于mode_t类型参数),这个参数是可选的,如果flags访问标志字中存在O_CREAT(文件不存在则创建)的标志,那么这时候就要有mode参数来规定这个新创建的文件的访问权限

open系统调用的返回值是一个文件描述符,它对应的是pathname指向的新打开的文件,本质是指向该进程文件描述符表的索引。文件描述符的分配并不是一个随机值,它被规定为进程中当前未被使用的文件描述符的最小值。基于此,我们可以推断甚至操控新分配的文件描述符的具体值。

当open系统调用失败时,C语言外壳函数将会返回-1,并设置errno,据此可以查看错误的原因。具体的错误类型可以查看官方手册中对open系统调用错误码的说明:open系统调用

猜你喜欢

转载自blog.csdn.net/zzy980511/article/details/115202295