基础IO——系统调用文件

在这里插入图片描述

1. 知识补充和回顾

1. 文件=文件内容+文件属性。即使创建一个空文件,也会占据磁盘数据。
2. 文件操作=文件内容操作+文件属性操作。在操作文件的过程中,既可能改变内容,又改变属性。
3. 当我们“打开”文件时,会将文件的属性或内容加载到内存中。
4. 是不是所有的文件都处于被打开状态?绝对不是!没有被打开的文件,只存储在磁盘上。
5. 那么文件描述符说的就是打开文件(内存文件),而磁盘文件后面的知识再说。
6. 通常我们打开文件,访问文件,关闭文件,是谁在进行相关的操作?答案是:当我们的文件程序,运行起来的时候,才会执行对应的代码(fopen,fclose,frean,fwrite… …),然后才是真正的对文件进行相关的操作。而这个就是进程

所以,下面我们就要围绕着进程和打开文件的关系来讲解

1.1 回顾C文件接口

大家如果不是太懂C语言文件的可以看这篇文章:C语言文件操作

下面写个小例子:
在这里插入图片描述
我们来看一下运行结果:
在这里插入图片描述
从这个代码中说几个问题:默认生成的这个文件(log.txt)在哪里形成的呢
答案是:当前路径。什么是当前路径呢?
在这里插入图片描述
我们来打印这个进程的pid来查看:
在这里插入图片描述
这个cwd就是当前路径,当前路径也是进程所处的工作路径

我们可以来验证一下:
在这里插入图片描述
我们在这先改变当前的路径。
在这里插入图片描述
我们可以看到cwd已经发生了改变。
在这里插入图片描述
在/home/wyw下生成了log.txt文件。

我们在来看一下:r,r+,w,w+,a,a+这些操作
在这里插入图片描述
先说一下a,这个a的意思是:追加写入,不断的往文件中新增内容
举个例子:
在这里插入图片描述
在这里插入图片描述
w的意思是:如果文件存在就清空,不存在就创建。然后从头写入
在这里插入图片描述
在这里插入图片描述
可以看到log.txt里已经没有内容了。
r的意思是:打开文件从头开始读。文件必须存在

1.2 理论理解

我们知道:我们向文件写入的时候,是向磁盘写入。而磁盘是硬件,只有OS有资格向硬件写入。所以,所有的上层访问文件的操作,都必须贯穿操作系统

那么操作系统是如何被上层访问的
答案是:必须使用操作系统提供的相关系统调用。

那么我们为什么都没有见过这些系统调用接口呢
答案是:因为我们用的所有语言都进行了封装

为什么要封装呢
1.原生系统接口,使用成本比较高
2.语言不具备跨平台性

那么像C语言的封装是如何解决跨平台性的呢?
答案是:穷举所有的底层接口+条件编译

那么像我们使用C库提供的文件访问接口一定会调用系统接口。所以不同的语言有不同的文件访问接口。因此,我们要学习文件级别的系统接口。

2. 系统调用文件接口

2.1 open

在C语言里我们打开文件用的fopen,而在系统调用里是open。
在这里插入图片描述
第一个参数pathname是指向想要打开的文件路径名,或者文件名。我们需要注意的是:这个路径名是绝对路径名。文件名则是在当前路径下的

第二个参数flags是什么意思呢?
在这里插入图片描述
flags参数表示打开文件所采用的操作,我们需要注意的是:必须指定以下三个常量的一种,且只允许指定一个
O_RDONLY:只读模式
O_WRONLY:只写模式
O_RDWR:可读可写

以下的常量是选用的,这些选项是用来和上面的必选项进行按位或起来作为flags参数。
O_APPEND 表示追加,如果原来文件里面有内容,则这次写入会写在文件的最末尾。
O_CREAT 表示如果指定文件不存在,则创建这个文件。

我们先学这5个,还有一些其它的选项我们暂时不关心。那么这些选项其实都是宏。

我们要知道:系统传递标记位,是用位图结构来标记的。每一个宏标记,一般只需要有一个比特位是1,并且和其它宏对应的值,不能重叠。

举个例子:
在这里插入图片描述
我们这里用不同的bit位来标识不同的宏。
在这里插入图片描述
然后我们这里写了一个打印函数,当我们传不同的宏时,就会打印出对应的意义。这个就相当于系统调用的open。
在这里插入图片描述
如果想打印多个,就按位或就行了。
在这里插入图片描述

返回值的意思是:
在这里插入图片描述
open函数的返回值:如果打开文件失败返回-1,否则返回一个大于0的值,表示文件描述符号 (内核用它来读取文件)

2.2 怎么使用

在这里插入图片描述
perror可以根据你的错误码直接打印你的错误码描述。我们可以看一下运行结果:
在这里插入图片描述
可以看到log.txt其实乱码了。原因是:我们创建一个不存在的文件,需要受到Linux权限的约束的。那么你的权限是什么需要告诉Linux。

第三个参数mode表示:设置文件访问权限的初始值,和用户掩码umask有关,也可以用S_IRUSR、S_IWUSR等宏定义按位或起来表示
在这里插入图片描述
我们再看一下运行结果:
在这里插入图片描述
但是这个的权限是664,这就是和umask有关。因为系统默认的掩码是002。如果我们就要设置为666呢?我们需要使用系统调用umask。
在这里插入图片描述
它不仅仅是一个命令,也是一个系统调用接口。
在这里插入图片描述
我们在这里设置umaks为0,这样就会按照我们设置的来创建文件权限。
在这里插入图片描述
1.文件权限由open的mode参数和当前进程的umask掩码共同决定。
2.第三个参数是在第二个参数中有O_CREAT时才作用,如果没有,则第三个参数可以忽略。

2.3 close和write

在这里插入图片描述
这是文件关闭。
在这里插入图片描述
文件的系统调用的写文件只有write一个。第二个参数就是我们要写入的首地址,根类型无关。第三个是写入的大小。
在这里插入图片描述
这里的strlen要不要加1呢?答案是:不需要。原因是:系统的调用不认识C语言的\0。
在这里插入图片描述
成功写入log.txt里面了。

在C语言中,以W方式打开文件时,会清空文件。那么在系统调用里呢

在这里插入图片描述
我们按照这样的方式来验证一下:
在这里插入图片描述
但是在系统调用里,并没有清空。原因是:我们缺少一个条件:
O_TRUNC 表示截断,如果文件存在,并且以只写、读写方式打开,则将其长度截断为0
这个选项就是清空,如果我们想像C语言一样,就要加上这个选项。
在这里插入图片描述
运行结果如下:
在这里插入图片描述

那么C语言中的追加也是同样的道理
在这里插入图片描述

2.4 read

在这里插入图片描述
第二个参数是我们要读的内容存到的区域(void 指针可以指向任意类型的数据),第三个参数是要读的大小。返回值是实际读的大小。ssize_t的意思是:有符号的整数。

举个例子:
在这里插入图片描述
运行结果:
在这里插入图片描述

这里可以这样>log.txt快速清空。
在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python的IO网络编程主要涉及socket模块。在socket模块中,有一些常用的函数,比如accept()和recv()。这些函数都是阻塞的,也就是说,如果没有数据可接收,它们一直等待,直到有数据可用。这种阻塞型接口是指系统调用(一般是IO接口)如果不返回结果就一直等待。在网络IO中,当一个read操作发生时,它经历两个阶段:等待数据准备和将数据从内核拷贝到进程中。\[1\]\[2\] 在Python的IO编程中,常见的操作包括网络操作、文件操作和终端操作。网络操作包括建立socket对象、进行连接、发送和接收数据等。文件操作包括建立file对象,进行文件的读写操作。终端操作包括进行交互式输入输出等操作。\[2\] 举个例子,如果想要进行网络编程中的广播接收,可以使用socket模块中的相关函数。首先,需要创建一个UDP套接字,并设置套接字为可以接收广播。然后,选择接收端口,并在一个循环中接收广播消息。广播发送的代码类似,需要创建一个UDP套接字,并设置套接字为可以发送广播。然后,使用sendto()函数发送广播消息。\[3\] 总结来说,Python的IO网络编程主要涉及socket模块,通过使用socket模块中的函数来进行网络操作、文件操作和终端操作。 #### 引用[.reference_title] - *1* *2* [python网络编程——网络IO模型](https://blog.csdn.net/JackLiu16/article/details/87838941)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [python IO网络编程](https://blog.csdn.net/weixin_30802171/article/details/96956828)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学代码的咸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值