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.mfbz.cn/a/301723.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker安装Centos8系统

引言&#xff1a;最小安装版Centos8系统安装docker软件安装记录 官网安装教程&#xff1a;https://dockerdocs.cn/engine/install/centos/index.html 操作系统镜像版本 CentOS-Stream-8-x86_64-latest-boot.iso 第一步&#xff1a;更新yum yum -y update第二步&#xff1a;…

大模型学习之书生·浦语大模型2——趣味Demo

文章目录 Demo效果目录大模型及InternLM模型介绍InterLM-Chat-7B智能对话DemoLagent智能体工具调用Demo浦语灵笔图文创作理解Demo通用环境配置实践智能对话Demo1 创建开发机2 进入开发机并创建环境及安装依赖3 模型下载4 代码准备5 终端运行6 web demo运行 Lagent智能体工具调用…

静态关键字:static

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

INT201 形式语言与自动机笔记(上)

Lec1 Overview Alphabet and String 字母表与字符串 Alphabet&#xff08;字母表&#xff09; a finite, nonempty set ∑ of symbols. String (word) – a finite sequence of symbols from the alphabet e.g ∑ {a, b}, then abab, aaaabbba are strings on ∑ ε Em…

利用人工智能和机器人技术实现复杂的自动化任务!

这篇mylangrobot项目由neka-nat创建&#xff0c;本文已获得作者Shirokuma授权进行编辑和转载。 https://twitter.com/neka_nat GitHub-mylangrobot &#xff1a;GitHub - neka-nat/mylangrobot: Language instructions to mycobot using GPT-4V 引言 本项目创建了一个使用GPT-4…

Prometheus实战篇:Prometheus监控rabbitmq

Prometheus实战篇:Prometheus监控rabbitmq 准备环境 docker-compose安装rabbitmq 这里注意rabbitmq需要暴露2个端口 docker-compose.yaml version: 3 services:rabbitmq:image: rabbitmq:3.7.15-managementcontainer_name: rabbitmqrestart: alwaysvolumes:- /data/rabbitmq…

漏洞复现--金蝶云星空反序列化远程代码执行

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

ChatGPT,革新未来,颠覆你的智能想象!

大家好我是在看&#xff0c;记录普通人学习探索AI之路。 你是否曾渴望对话的边界无限拓宽&#xff1f;是否期待科技力量重塑生活日常&#xff1f;ChatGPT&#xff0c;就是那个引领时代潮流、解锁未来智能生活的关键钥匙&#xff01;它不仅仅是一个技术名词&#xff0c;更是新一…

看图识熊(四)

概述 人工智能已经快要进入应用的高峰期了&#xff0c;但并不需要每个人都学习算法、建模。对于程序员来说&#xff0c;应该先从自己会的方向入手&#xff0c;学习如何应用AI来解决问题&#xff0c;开发应用。 本文将带着大家动手&#xff0c;从头做一个看图识熊的应用&#…

rk3566 armbian修复usb2.0并挂载U盘

文章目录 usb接口修复一 执行命令二 修改rk3566-panther-x2.dts⽂件三 查看是否识别 U盘格式化、挂载一 U盘格式化1.1 查看U盘1.2 查看U盘文件系统类型1.3 格式化为ext4系统 二 挂载U盘2.1 手动挂载2.2 自动挂载&#xff08;可选&#xff09; usb接口修复 一 执行命令 将位于…

1.69寸SPI接口240*280TFT液晶显示模块使用硬件SPI,并提高全屏刷新率的方法探讨

1.69寸SPI接口240*280TFT液晶显示模块&#xff0c;卖家提供了GPIO模拟SPI功能&#xff0c;我移植到了freertos&#xff0c;并点亮了屏幕&#xff0c;接下来是进行硬件SPI的程序修改&#xff1a; 上次还讲到了关于CS管脚的选通信号&#xff0c;再GPIO口的初始化的时候设置为高电…

年度盘点 | 信捷科技2023年的精彩瞬间

岁序更替&#xff0c;华章日新 与你同行的每一天&#xff0c;我们写下了无数回忆 我们一起穿越城市&#xff0c;畅享便捷 看到了“村超”的精彩 聆听了路边音乐节的热闹 见证了贵阳步入轨道交通“线网时代” …… 我们一起携手并进 让每一次出行都成为双向奔赴的可能 …

抖音矩阵系统源码开发

抖音作为一款流行的短视频分享平台&#xff0c;每天吸引着数以亿计的用户&#xff0c;在全球范围内广受欢迎。为了支持如此庞大的用户群体&#xff0c;抖音必须依靠强大的矩阵系统来支撑其稳定的运行。下面将介绍抖音矩阵系统的源码开发。 抖音矩阵系统源码开发主要有以下几个…

振弦采集仪在桥梁结构监测中的应用研究

振弦采集仪在桥梁结构监测中的应用研究 振弦采集仪在桥梁结构监测中的应用研究是指利用振弦采集仪对桥梁结构进行监测和数据采集的研究。振弦采集仪是一种能够实时监测桥梁结构振动情况的设备&#xff0c;通过采集桥梁上的振弦传感器获取振动数据&#xff0c;并将数据传输到监…

vue3+vite +element plus日历date picker中文显示

项目情况 element-plus 默认是英文模式&#xff0c;需要中文模式的话需要设置一下&#xff1a; 项目框架&#xff08;vue3&#xff09;&#xff1a;vite JS element-plus 版本&#xff1a;&#xff08;注意版本兼容&#xff0c;element plus 较低版本&#xff1a;1.xx.xx&a…

4.vue学习(21-25)

文章目录 21.天气案例-监视属性引入22.监视属性23.深度监视24 监视的简写25 监视属性对比计算属性 21.天气案例-监视属性引入 效果&#xff1a;点击按钮&#xff0c;切换凉爽为炎热 vscode 开发vue的插件;vue 3 snippets 初步实现方式。计算属性&#xff1a; 案例中的坑&#…

山西电力市场日前价格预测【2024-01-09】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-01-09&#xff09;山西电力市场全天平均日前电价为314.92元/MWh。其中&#xff0c;最高日前电价为593.66元/MWh&#xff0c;预计出现在18:15。最低日前电价为54.95元/MWh&#xff0c;预计出…

SurfaceFlinger的commit/handleTransaction分析

整体背景介绍 hi&#xff0c;粉丝朋友们&#xff1a; 大家好&#xff01;本节我们来讲解一下SurfaceFlinger主要合成工作的第一个阶段任务commit 一般SurfaceFlinger端的合成工作主要有两个 1.commit 主要就是处理app端发起的一系列transaction的事务请求&#xff0c;需要对这…

uniapp 微信小程序跳转外部链接

一、背景&#xff1a; 开发小程序时&#xff0c;跳转到内部路径通常会使用&#xff1a;uni.navigateTo&#xff0c;uni.redirectTo&#xff0c;uni.reLaunch&#xff0c;uni.switchTab等方法&#xff0c;可以跳转到pages.json中已经注册的页面 uni.navigateTo(OBJECT) | uni-…
最新文章