Linux——文件的系统调用

发布时间:2024年01月18日

我们之前了解了文件的操作,我们现在要探究一下这背后的更底层的原因——系统调用

open

我们用fopen来打开文件,其实这是C语言的提供的接口,我们调用了fopen之后,操作系统会调用更底层的接口——open系统调用。

在这里插入图片描述
我们可以不用C语言的接口,直接用操作系统的系统调用,来创建一个文件:
我们来看看这两个函数的参数:
在这里插入图片描述先来了解一下flags参数:

flags参数

在这里插入图片描述我们看到flags有这样的几个可选项:O_RDONLY, O_WRONLY, O_RDWR,从左到右分别是:只读只写可读写
除此之外还有这几个在创建文件时候的参数:
在这里插入图片描述

创建文件

我们可以用系统调用来创建我们的文件:
在这里插入图片描述
创建文件之后,我们记得要关闭文件,关闭文件也有自己的系统调用:
在这里插入图片描述我们包含一下头文件:
在这里插入图片描述运行一下:
在这里插入图片描述
我们看到现在我们的文件是被正确的创建出来了,但是感觉有点怪怪的,而且这个文档的权限是乱的,这是怎么回事?我们还没有用我们open的第三个参数mode,这第三个参数,就表明了你要以什么样的方式来创建文件,我们把第三个参数加上:
在这里插入图片描述在这里插入图片描述我们看到我们创建文件时,文件的权限是正常了,但是好像不是我们设置的权限,还记的我们之前的权限掩码吗?umask
在这里插入图片描述
umask限制了我们创建文件时候的权限,我们也可以通过系统调用去设置:
在这里插入图片描述我们现在把umask设置为0:
在这里插入图片描述
我们现在发现这时候的权限是按照我们的权限设置的了,并且我们看看权限掩码:
在这里插入图片描述我们发现权限掩码并没有发生改变,因为我们只是设置设置了这个文件的权限,并没有修改系统的umask。那么我们有两个umask,那么创建文件的时候应该听谁的?我们就近原则,谁离的open近,听谁的。

写入操作

我们打开文件之后,我们就可以向这个文件里写入内容,而写入,我们只有一个系统调用:write
在这里插入图片描述
我们可以来试试:
在这里插入图片描述
在这里插入图片描述
我们此时,将写入的字符写短一些:
在这里插入图片描述
我们再来看看:
在这里插入图片描述
我们发现此时的写入是覆盖式写入,并没有把原来的内容清除,如果我们想在写入新内容之前把旧内容清空,我们要加上一个标志:O_TRUNC
在这里插入图片描述
加上这个标志之后,我们每次创建文件之前,文件的内容都会被清空:
在这里插入图片描述
在这里插入图片描述
同时,我们如果想追加写入的话,我们的加上O_APPEND
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
我再执行一次mybin:
在这里插入图片描述
又追加了一条Hello world。

理解fd(file descriptor)

我们在了解open系统调用的时候,我们注意一下它的返回值:
在这里插入图片描述
而手册里面又是这样描述这个返回值的:
在这里插入图片描述手册里说,会返回一个文件描述符,也就是我们的fd(file descriptor),我们可以把它打印出来看看:
在这里插入图片描述在这里插入图片描述
我们发现每一个fd是一串连续的小整数,一个连续的数组下标,我们通常会想到数组,FILE指针里会不会封装了一个类似于数组的结构。

其实是的,我们的PCB中会封装一个结构,这个结构是一个数组,用来存放这个进程打开的文件:
在这里插入图片描述
那为什么是从3开始放的呢?其实这个表会先默认放3个:stdin,stdout,stderr(标准输入,输出,错误)

文件描述符表是在操作系统中用于跟踪和管理打开文件的数据结构。每个正在运行的进程都有一个文件描述符表,它记录了该进程打开的文件以及相应的信息。文件描述符是一个非负整数,通常是小整数。以下是文件描述符表的一些基本概念:
标准文件描述符:
0:标准输入(stdin)
1:标准输出(stdout)
2:标准错误(stderr)
这三个文件描述符是每个进程默认打开的,用于输入、输出和错误处理。
打开文件
当进程打开一个文件时,操作系统会分配一个文件描述符,该描述符在文件描述符表中占据一个条目。这个条目包含有关打开文件的信息,如文件位置、权限等。
文件描述符的限制:
操作系统为每个进程设置了文件描述符的数量限制。这个限制通常由ulimit命令来设置,它可以防止进程打开过多的文件,导致资源耗尽。
文件描述符的传递:
在某些情况下,进程可以将文件描述符传递给另一个进程。这种机制通常用于进程间通信或重定向输入输出。
关闭文件描述符:
进程使用完一个文件后,应该关闭相应的文件描述符,释放资源。关闭文件描述符并不意味着删除文件,而只是释放了进程占用的资源。
文件描述符表的操作:
操作系统提供了一系列系统调用(如open、read、write、close等)来操作文件描述符表,使进程能够进行文件的读写和管理。
dup和dup2系统调用:
这两个系统调用允许一个文件描述符的副本被创建,从而使得同一个文件可以被多个文件描述符引用。这在重定向输入输出时非常有用。

我们可以打印出来看看:
在这里插入图片描述在这里插入图片描述

文章来源:https://blog.csdn.net/qq_67693066/article/details/135602227
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。