1.3号io网络

news2024/11/13 10:00:59

文件IO

1.文件IO是基于系统调用

2.程序每进行一次系统调用,就会从用户空间向内核空间进行一次切换,执行效率较慢

3.目的:由于后期进程间通信,如管道、套接字通信,都使用的是文件IO,所以引入文件IO操作的概念

文件描述符

1.文件描述符本质上是一个非负整数,每个打开的文件,都会对应一个整数用于系统调用

2.每个程序打开文件的个数是有上限的,默认是1024个,可以通过ulimit -a进行查看

3.文件描述符使用原则:最小未分配原则

4.当使用open函数打开一个文件时,系统会给该文件分配一个文件描述符作为句柄

5.当一个程序运行时,默认会打开三个文件描述符,分别对应标准输入、标准输出、标准出错

open函数

int open(const char *pathname, int flags);

int open(const char *pathname, int flags, mode_t mode);

功能:打开或可能创建一个文件

参数1:文件路径,是一个字符串表示要打开的文件

参数2:打开标识

三个必须选一个:O_RDONLY(只读)、O_WRONLY(只写)、O_RDWR(读写) 后面的可以以位或的方式连接,表示拥有该属性

O_CREAT:表示创建一个文件, 当第二个参数中有O_CREAT时,第三个参数必须要加上

O_APPEND:追加方式打开文件 O_TRUNC:清空文件内容

O_NONBLOCK:以非阻塞形式打开文件

O_EXCL:确保本次操作一定创建文件,如果文件已经存在,则open函数会报错,错误码为EEXIST

eg:

"w": O_WRONLY | O_CREAT | O_TRUNC

"r":O_RDONLY

"a":O_WRONLY | O_APPEND | O_CREAT

"w+":O_RDWR | O_CREAT | O_TRUNC

"r+":O_RDWR

"a+":O_RDWR | O_CREAT | O_APPEND

参数3:如果第二个参数中有O_CREAT,该参数必须设置,表示文件的权限,如果不设置,该文件的权限是一个随机权限

一般创建普通文件最大权限为:664

目录文件权限最大权限为:775

返回值:成功返回一个新的文件描述符,失败返回-1并置位错误码。

close函数

#include <unistd.h>

int close(int fd);

功能:关闭指定的文件描述符

参数:要关闭的文件描述符,关闭后,该文件描述符可以分配给其他文件使用

返回值:成功返回0,失败返回-1并置位错误码

write\read函数

#include <unistd.h>

ssize_t write(int fd, const void *buf, size_t count);

功能:将buf指向的地址中count个字节,写入到fd指向的文件中

参数1:文件描述符

参数2:容器起始地址,void*类型,表明可以写入任何类型的数据

参数3:要写入数据的个数

返回值:成功返回写入的字符个数,失败返回-1并置位错误码

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);

功能:从fd文件中,将count个字节读取到buf对应的容器中

参数1:文件描述符

参数2:容器起始地址,void*类型,表明可以读取任何类型的数据

参数3:要读取数据的个数

返回值:成功返回读取字节的个数,失败返回-1并置位错误码

光标移动(lseek)

#include <sys/types.h>

#include <unistd.h>

off_t lseek(int fd, off_t offset, int whence);

功能:移动光标位置

参数1:要移动光标的文件描述符

参数2:偏移量 >0:表示向后偏移 =0:表示不偏移 <0:表示向前偏移

参数3:偏移的起始位置

SEEK_SET:从文件开头偏移

SEEK_CUR:从文件光标当前位置偏移

SEEK_END:从文件末尾开始偏移

返回值:成功返回光标当前位置,失败返回(off_t)-1并置位错误码

lseek = fseek + ftell

关于文件描述符的拷贝问题

使用赋值的情况直接拷贝,多个文件描述符变量,共享同一个文件光标,通过一个文件描述符进行移动,所有的文件描述符的光标都会改变

int fd1 = -1;

if((fd1 = open("./test.txt", O_RDONLY)) == -1)

{

        perror("open error"); return -1;

}

printf("fd1 = %d\n", fd1); //3

int fd2 = fd1;                 //对文件描述符直接进行拷贝

共享一个文件光标,因为描述符一样

使用dup函数,完成文件描述符的拷贝

#include <unistd.h>

int dup(int oldfd);

功能:通过旧的文件描述符,拷贝出一个新的文件描述符,新文件描述符遵循最小未分配原则

参数:旧文件描述符

返回值:新文件描述符,失败返回-1并置位错误码 执行后,新旧两个文件描述符都指向同一个打开的文件,共享文件光标位置

使用dup2函数完成两个文件描述符的拷贝

int dup2(int oldfd, int newfd);

功能:通过拷贝旧的文件描述符到新的文件描述符中

参数1:旧文件描述符

参数2:新文件描述符,如果newfd已经指向了某个已经打开的文件,则在进行拷贝之前,先将其关闭

返回值:成功返回新的文件描述符,失败返回-1并置位错误码

注意:newfd不是使用最小为分配原则,因为newfd在调用之前可能已经指向某个文件,调用后,无论是newfd函数oldfd都指向oldfd指向的文件通过该方式复制的文件描述符,依然共享同一个文件的光标

多次使用open函数完成对同一个文件的打开时,不同的文件描述符使用的是独立的光标

文件属性获取(stat)

#include <sys/types.h>

#include <sys/stat.h>

#include <unistd.h>

int stat(const char *pathname, struct stat *statbuf);

功能:将给定的文件的相关属性,通过statbuf返回出来

参数1:要获取属性的文件路径是一个字符串

参数2:文件属性结构体指针,需要传递一个文件属性类型的结构体变量

返回值:成功返回0,失败返回-1并置位错误码

目录相关操作

opendir函数

#include <sys/types.h>

#include <dirent.h>

DIR *opendir(const char *name);

功能:打开一个指定的目录,并返回该目录的目录指针

参数:要打开的目录,是一个字符串

返回值:成功返回目录指针,失败返回NULL并置位错误码

closedir函数

#include <sys/types.h>

#include <dirent.h>

int closedir(DIR *dirp);

功能:关闭一个已经打开的目录指针

参数:目录指针

返回值:成功返回0,失败返回-1并置位错误码

readdir函数

#include <dirent.h>

struct dirent *readdir(DIR *dirp);

功能:读取指定目录中的下一个文件或目录的信息

参数:目录指针

返回值:成功返回当前文件或目录的信息,失败返回NULL并置位错误码

作业

1.标准io

2.文件io

3.stat函数

4.目录操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1366292.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

localhost和127.0.0.1的区别是什么?

localhost和127.0.0.1的区别是什么&#xff1f; 前端本地调试的时候&#xff0c;应该没少和localhost打交道&#xff0c;只需要执行 npm run 就能在浏览器中打开页面窗口&#xff0c;地址栏显示的就是这个 http://localhost:xxx/index.html localhost是什么&#xff1f; loca…

嘴尚绝:卤味市场未来发展潜力无限,谁将成为下一个风口?

随着人们生活水平的提高&#xff0c;卤味作为一种美味的小吃&#xff0c;越来越受到消费者的喜爱。在餐饮市场上&#xff0c;卤味市场也呈现出越来越繁荣的景象。那么&#xff0c;卤味市场未来发展如何呢&#xff1f;今天&#xff0c;我们就来探讨一下这个问题。 一、消费升级推…

大数据HCIE成神之路之特征工程——特征选择

特征选择 1.1 特征选择 - Filter方法1.1.1 实验任务1.1.1.1 实验背景1.1.1.2 实验目标1.1.1.3 实验数据解析1.1.1.4 实验思路 1.1.2 实验操作步骤 1.2 特征选择 - Wrapper方法1.2.1 实验任务1.2.1.1 实验背景1.2.1.2 实验目标1.2.1.3 实验数据解析1.2.1.4 实验思路 1.2.2 实验操…

气膜建筑:舒适、智能、可持续

气膜建筑之所以能够拥有广阔的发展空间&#xff0c;源于其融合了诸多优势特点&#xff0c;使其成为未来建筑领域的前沿趋势。 气膜建筑注重环境可持续性和能源效率。在材料和设计上&#xff0c;它采用可回收材料、提高热保温效果&#xff0c;并积极利用太阳能等可再生能源&…

微电子专业词汇汇总,ICer入门必备!

在芯片行业&#xff0c;很多相关的技术术语都是用英文表述。在这里为大家整理了一些常用的微电子专业词汇&#xff0c;希望对大家有所帮助。&#xff08;文末可领全部文档&#xff09; Abrupt junction 突变结 Accelerated testing 加速实验 Acceptor 受主 Acceptor atom 受主…

【计算机网络】ARP最全详解

在网络世界中&#xff0c;只有两种地址&#xff0c;一种是之前讲解过的MAC地址&#xff0c;另一种是IP地址。MAC地址是烧制在NIC网卡内部的物理地址&#xff0c;在数据链路层中进行&#xff1b;IP地址则是在操作系统&#xff08;OS&#xff09;中设置的逻辑地址&#xff0c;在网…

启动ElasticSearch报错:ERROR: Elasticsearch exited unexpectedly, with exit code 78

我在Ubuntu下通过Docker安装ElasticSearch的时候&#xff0c;启动容器报错&#xff0c;最后一行报错内容如下&#xff1a; ERROR: Elasticsearch exited unexpectedly, with exit code 78上图是完整报错日志&#xff0c;从中我们可以看到关键错误信息&#xff0c;错误原因是vm…

多线程-生产者消费者模型

一、基本信息 1、场景介绍&#xff1a;厨师和吃货的例子&#xff0c;吃货吃桌子上的面条&#xff0c;吃完让厨师做&#xff0c;厨师做完面条放桌子上&#xff0c;让吃货吃&#xff0c;厨师如果发现桌子上有面条&#xff0c;就不做&#xff0c;吃货发现桌子上没有面条就不吃。 …

UE5 C++(十三)— 创建Character,添加增强输入

文章目录 创建Character第三人称模板添加增强输入引用在脚本中实现移动、旋转 创建Character第三人称模板 创建MyCharacter C类 添加增强输入引用 在DEMO.Build.cs 脚本中添加增强输入模块 有个容易出错的点&#xff0c;这里的设置一定要正确 然后添加引用到C头文件中 …

vim/vi 模式切换和常用快捷键

vim/vi 切换模式&#xff1a; vim/vi 常用快捷键&#xff1a; 一般模式&#xff1a; gg&#xff1a;文件开头、G&#xff1a;文件结尾 shift^ &#xff1a;光标当前行首、shift^&#xff1a;光标当前行尾 yy&#xff1a;复制、p&#xff1a;粘贴、dd&#xff1a;删除当前行、…

VScode右键没有go to definition选项

1. 背景 1.1. 项目代码在远程服务器上&#xff1b; 1.2. win重装系统&#xff0c;重新安装vscode出现问题&#xff0c;没重装系统之前是没问题的&#xff1b; 2. 问题 打开vscode&#xff0c;通过ssh链接远程服务器中的项目代码后&#xff0c;选中函数右键没有go to defini…

年底了,来看看测试大佬的年终项目总结吧!值得借鉴

测试总结&#xff0c;是测试负责人或测试经理的测试管理能力的体现。在项目或版本测试完成&#xff0c;测试报告上交后&#xff0c;测试的工作并不是完结了&#xff0c;而是另外一件大事需要做&#xff0c;那就是为这个项目或是版本做一次测试总结。 添加图片注释&#xff0c;不…

10本审稿及出版效率均较好的科普期刊参数分享!

医、药、护、技及医学工程等相关的人员&#xff0c;进行卫生高级职称评审时&#xff0c;需要在专业期刊上公开发表本专业学术论文&#xff0c;论文的方向、内容质量以及发表的刊物都至关重要。今天常笑医学给大家整理了10本审稿及出版效率均较好的科普期刊&#xff01;参数分享…

搭建React开发环境-webpack实现

周末在家学会React前端知识&#xff0c;记录下来&#xff0c;方便备查。 webpack版本&#xff1a;webpack5 编译器&#xff1a;vscode 第一步、新建项目及初始化 1&#xff09;新建项目文件夹 可命名为 my_webpack 2&#xff09;初始化项目 使用命令 npm init -y&#xff0c;…

[SpringBoot]接口的多实现:选择性注入SpringBoot接口的实现类

最近在项目中遇到两种情况&#xff0c;准备写个博客记录一下。 情况说明&#xff1a;Service层一个接口是否可以存在多个具体实现&#xff0c;此时应该如何调用Service&#xff08;的具体实现&#xff09;&#xff1f; 其实之前的项目中也遇到过这种情况&#xff0c;只不过我采…

CTF之逆向入门

逆向工程(Reverse Engineering)&#xff0c;又称反向工程&#xff0c;是一种技术过程&#xff0c;即对一项目标产品进行逆向分析及研究&#xff0c;从而演绎并得出该产品的处理流程、组织结构、功能性能规格等设计要素&#xff0c;以制作出功能相近&#xff0c;但又不完全一样的…

微信私密朋友圈被吐槽有BUG

日前&#xff0c;大量网友在各社交媒体上讨论微信私密朋友圈出现 Bug 的话题&#xff0c;起因是跨年期间一个网友发布了一条”私密朋友圈&#xff0c;但不一会就收到朋友发来的信息&#xff0c;”又偷偷发朋友圈了&#xff1f;“&#xff0c;估计此时网友可能已经”寒毛四起、汗…

物理机搭建hive

一、修改Hadoop配置 修改core-site.xml 配置yarn-site.xml 分发文件&#xff0c;然后重启集群 二、 Hive解压安装 上传文件 添加hive环境便量&#xff0c;source生效 启动高可用集群&#xff0c;启动hive 三、配置mysql元数据库 检查当前系统是否安装过Mysql&#xf…

基于MATLAB车牌识别系统设计

基于MATLAB车牌识别系统设计 一、设计方案 智能交通系统已成为现代社会道路交通发展趋势。在智能交通系统中&#xff0c;车牌自动识别系统是一个非常重要的发展方向。对于车牌识别系统的要满足当车辆通过摄像头采集车辆图片&#xff0c;将其图片进行图像预处理、车牌定位、字符…

关于FPGA仿真复位信号和实际板子复位信号的吐血大坑

最近在研究mipi dphy IP下载到板子上进行验证的初步流程问题 IP的example案例里面&#xff0c;系统复位全是高电平复位&#xff0c;低电平工作 想当然的打通IP流程&#xff0c;写工程的时候也使用了高电平复位&#xff0c;低电平复位 结果调试了N轮&#xff0c;init_done信号一…