1.3号io网络

文件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.mzph.cn/news/605540.shtml

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

相关文章

MATLAB根据数据拟合曲线

MATLAB根据数据拟合曲线 MATLAB根据数据拟合曲线视频观看 MATLAB根据数据拟合曲线 x1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,6…

C语言之详解数组【附三子棋和扫雷游戏实战】

文章目录 一、一维数组的创建和初始化1、数组的创建2、数组的初始化3、一维数组的使用4、 一维数组在内存中的存储 二、二维数组的创建和初始化1、二维数组的创建2、二维数组的初始化3、二维数组的使用4、二维数组在内存中的存储 三、数组越界边界值考虑不当导致越界访问数组大…

Mysql数据库的基础操作

1、数据库的数据类型和结构设置&#xff0c;修改等 DML&#xff1a;针对数据的增删改 where条件更像是这一条命令中的限制条件&#xff0c;如果不带where条件的时候&#xff0c;相当于针对全表所有字段进行操作 DQL&#xff1b; 数据查询语言 1、查询关键词使用 select 这个里…

MYSQL学习之buffer pool的理论学习

MYSQL学习之buffer pool的理论学习 by 小乌龟 文章目录 MYSQL学习之buffer pool的理论学习前言一、buffer pool是什么&#xff1f;二、buffer pool 的内存结构三、buffer pool 的初始化和配置初始化配置 四、buffer pool 空间管理LRU淘汰法冷热数据分离的LRU算法1.引入库2.读入…

MacBook Pro M1搭建Kafka2.7版本源码运行环境

原创/朱季谦 最近在阅读Kafka的源码&#xff0c;想可以在阅读过程当中&#xff0c;在代码写一些注释&#xff0c;便决定将源码部署到本地运行。 日常开发过程中&#xff0c;用得比较多一个版本是Kafka2.7版本&#xff0c;故而在MacBook Pro笔记本上用这个版本的源码进行搭建&…

计算机网络实验(二):Wireshark网络协议分析

一、实验名称&#xff1a;Wireshark网络协议分析 二、实验原理 HTTP协议分析 1.超文本传输协议&#xff08;Hypertext Transfer Protocol, HTTP&#xff09;是万维网&#xff08;World Wide Web&#xff09;的传输机制&#xff0c;允许浏览器通过连接Web服务器浏览网页。目…

高性能、可扩展、支持二次开发的企业电子招标采购系统源码

在数字化时代&#xff0c;企业需要借助先进的数字化技术来提高工程管理效率和质量。招投标管理系统作为企业内部业务项目管理的重要应用平台&#xff0c;涵盖了门户管理、立项管理、采购项目管理、采购公告管理、考核管理、报表管理、评审管理、企业管理、采购管理和系统管理等…

2023我的编程之旅、2024新的启程

目录 一、2023年结束、2024年开始 1、回顾2023年 1.1、发表文章概述 1.2、开发中遇到的问题与解决方案 2、展望2024年 2.1、新年Flag 2.2、收获与成长 一、2023年结束、2024年开始 光阴荏苒&#xff0c;从我开始在CSDN写作已经2年零5个月了&#xff0c;我也在不断的思考…

关于使用统一服务器,vscode和网页版jupyter notebook的交互问题

autodl 查看虚拟环境 在antodl上租借了一个服务器&#xff0c;通过在网页上运行jupyter notebook和在vscode中运行&#xff0c;发现环境都默认的是miniconda3。 conda info --envs 当然环境中所有的包都是一样的。 要查看当前虚拟环境中安装的所有包&#xff0c;可以使用以…

在CentOS 7.6上配置HTTP隧道代理

是一个相对复杂的过程&#xff0c;涉及到多个步骤。以下是一个详细的步骤指南&#xff0c;供您参考&#xff1a; 1. 安装必要的软件包 首先&#xff0c;您需要安装一些必要的软件包。打开终端&#xff0c;并执行以下命令&#xff1a; bash复制代码 sudo yum install -y epel…

Linux内核--网络协议栈(一)Socket通信原理和实例讲解

目录 一、引言 二、Socket ------>2.1、socket编程 ------>2.2、Socket的创建 三、收发数据 四、断开连接 五、删除套接字 六、网络 IO 一、引言 本章开始进入linux内核中网络部分的学习,先简单介绍一下socket套接字 二、Socket 一个数据包经由应用程序产生…

2024年如何借用电商新零售破局?新型商业模式——乐享甄选竞拍模式

2024年如何借用电商新零售破局&#xff1f;新型商业模式——乐享甄选竞拍模式 背景&#xff1a;经历疫情三年的黑天鹅&#xff0c;消费者对未来收入预期和不自信等悲观情绪&#xff0c;从而使得“勒紧腰带&#xff0c;少消费&#xff0c;不消费”&#xff0c;以简单实用成为了新…

DRF-源码解析-4-限流的流程:drf的限流源码,drf流量控制流程,drf如何流量控制

流量控制的逻辑&#xff1a; 1、设置一个唯一标识&#xff0c;作为cache的key 2、请求访问时&#xff0c;构造唯一标识&#xff0c;从ceche中获取[时间1,时间2,时间3,…] 3、根据设置流量控制规则&#xff0c;如&#xff1a;5/m (一分钟最多访问5次)&#xff0c;判断该唯一标…

基于ssm的常见小儿疾病中医护理系统的设计+jsp论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本小儿疾病中医护理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据…

湖南大学-计算机网路-2023期末考试【部分原题回忆】

前言 计算机网络第一门考&#xff0c;而且没考好&#xff0c;回忆起来的原题不多。 这门学科学的最认真&#xff0c;复习的最久&#xff0c;考的最差。 教材使用这本书&#xff1a; 简答题&#xff08;6*530分&#xff09; MTU和MSS分别是什么&#xff0c;联系是什么&#x…

如何衡量一个排序算法的性能

这是八股文的知识&#xff0c;但是中国人又个好的习惯&#xff0c;当别人给你一块好吃的面包时&#xff0c;你总想知道这个面包是怎么做的&#xff0c;对于目前的IT行业来说&#xff0c;不管这个做法你是被动的学习还是主动的探索&#xff0c;你都要知道&#xff0c;也必须要知…

如何解决vscode中文路径的问题

首先我们进入设备 搜索“区域”&#xff0c;选择“区域设置” 点击管理语言设置 点击更改系统区域设置&#xff0c;勾选“Beta 版: 使用 Unicode UTF-8 提供全球语言支持(U)”&#xff0c;电脑会叫你重启&#xff0c;你重启就行了

Node.js(四)-express

1. 初识express 1.1 express简介 1.1.1 什么是express 官方&#xff1a;Express是基于Node.js平台&#xff0c;快速、开放、极简的web开发框架。 通俗&#xff1a;Express的作用和Node.js内置的http模块类似&#xff0c;是专门用来创建web服务器的。 express的本质&#xff1…

代码随想录刷题第四十二天| 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集

代码随想录刷题第四十二天 今天是0-1背包问题&#xff0c;掌握了套路就不难了~~~ 0-1背包问题理论基础&#xff08;二维数组篇&#xff09;卡码网第46题 题目思路&#xff1a; 代码实现&#xff1a; input_line input() # 读取一行输入 mn input_line.split() m, n int…

静态关键字:static

static的作用 static是静态的意思&#xff0c;可以修饰成员变量和成员方法。 static修饰成员变量表示该成员变量只在内存中只存储一份&#xff0c;可以被共享访问、修改。 成员变量 分为2类 静态成员变量&#xff08;有static修饰&#xff0c;属于类&#xff0c;内存中加载…