30天精通Linux系统编程-----第一天:底层文件I/O (建议收藏)

目录

1.什么是底层文件I/O

2.底层文件I/O常用库函数

2.1 write函数

2.2 read函数

2.3 open函数

2.4 close函数

2.5 lseek函数

2.6 ioctl函数

2.7 fcntl()函数

2.8 pread()函数

2.9 pwrite()函数


1.什么是底层文件I/O

        底层I/O指的是与硬件设备之间的直接输入输出操作。这些操作通常涉及文件系统和设备驱动程序,并且可以通过系统调用进行访问,如open()、read()、write()等。底层I/O允许程序直接与硬件设备进行通信,例如磁盘驱动器、网络接口卡、键盘、鼠标等

2.底层文件I/O常用库函数

通常来说,我们学习一个函数就是从 参数,返回值,函数作用三个方面去学习一个函数。

        在Linux中当我们打开一个程序是一般来说将会打开三个文件,可以理解为终端上的控制台的输入输出,其中0,1,2即为文件描述符。

  1. 标准输入流:0
  2. 标准输出流:1
  3. 标准错误流:2
2.1 write函数
  • 参数:
    • fd:要写入的文件描述符。
    • buf:要写入的数据缓冲区。
    • count:要写入的字节数。
  • 返回值:
    • 若成功,则返回写入的字节数(非负整数)。
    • 若失败,则返回-1,并设置errno。
  • 作用:将缓冲区buf的count个字节写入文件描述符相关联的文件中。
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);

  例子

        向终端控制台输出Hello world 错误则输出Write error        

#include <stdio.h>
#include <unistd.h>int main()
{if(writr(1,"Hello world\n",12)!=18){write(2,"Write error.\n",13);}exit(0);
}

输出

2.2 read函数
  • 参数:
    • fd:要读取的文件描述符。
    • buf:用于存放读取数据的缓冲区。
    • count:要读取的字节数。
  • 返回值:
    • 若成功,则返回读取的字节数(非负整数)。
    • 若已到达文件末尾,则返回0。
    • 若失败,则返回-1,并设置errno。
  • 作用:从文件中读取count个字节数存入到buf中。
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);

例子

     读取终端输入并将读到的数据打印在屏幕上

#include <unistd.h>
#include <stdio.h>int main()
{char buf[1024];int ret = read(0,buf,128);if(ret >1)write(1,"Read success\n",13);if(ret == 0)write(1,"End of file\n",12);if(ret =-1)write(1,"Read error\n",10);write(1,"Read data:",10);write(1,buf,ret);exit(0);
}

输出

2.3 open函数
  • 参数:
    • pathname:要打开的文件路径。
    • flags:打开文件的方式和标志,可以是以下常量的组合:O_RDONLYO_WRONLYO_RDWRO_CREATO_TRUNC等。
    • mode:创建文件时的权限,仅当O_CREAT被指定时有效。
  • 返回值:
    • 若成功,则返回文件描述符(非负整数),表示打开的文件。
    • 若失败,则返回-1,并设置errno。
  • 作用:用于打开文件。
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

例子

       创建一个可读可写文件;

#include <fcntl.h>
#include <unistd.h>
#inc;ude <stdio.h>int main()
{int fd = open("test.txt",O_RDWR|O_CREAT,S_IWUSR|S_IRUSR);write(fd,"Hello world\n",12);close(fd);exit(0);
}

输出

2.4 close函数
  • 参数:
    • fd:要关闭的文件描述符。
  • 返回值:
    • 若成功,则返回0。
    • 若失败,则返回-1,并设置errno。
  • 作用:用于关闭一个已打开的文件描述符
#include <unistd.h>
int close(int fd);

        

例子

#include <fcntl.h>
#include <unistd.h>
#inc;ude <stdio.h>int main()
{int fd = open("test.txt",O_RDWR|O_CREAT,S_IWUSR|S_IRUSR);write(fd,"Hello world\n",12);close(fd);exit(0);
}
2.5 lseek函数
  • 参数:
    • fd:要定位的文件描述符。
    • offset:偏移量。
    • whence:起始位置,可以是SEEK_SETSEEK_CURSEEK_END
  • 返回值:
    • 若成功,则返回新的文件偏移量。
    • 若失败,则返回-1,并设置errno。
  • 作用:移动文件描述符的读写位置。
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);

例子

        当前位置偏移5个字节

#include<fcntl.h>
#include <unistd.h>
#include <stdio.h>int main()
{char buf[1024];int ret;int fd = open("test.txt",O_RDWR);lseek(fd,5,SEEK_CUR);if((ret = read(fd,buf,128))<1){write(2,"Read error\n",11);}write(1,"Data read after movement:",25);write(1,buf,ret);}

输出

        

2.6 ioctl函数
  • 参数:
    • fd:文件描述符。
    • request:请求代码。
    • ...:根据请求代码可能需要的额外参数。
  • 返回值:
    • 根据不同的请求代码和操作可能返回不同的值。
  • 作用:对设备进行各种控制操作,例如设置设备参数等。
#include <sys/ioctl.h>
int ioctl(int fd, unsigned long request, ...);

例子

        获取终端长宽

#include<stdio.h>
#include <unistd.h>
#include <sys/ioctl.h>int main()
{struct winsize ws;if(ioctl(STDOUT_FILENO<TIOCGWINSZ,&WS)== -1){write(2,"Error\n",6);}    printf("Terminal windows size: %d rows x %d columns\n",ws.ws_row,ws_col);return 0;
}

输出

2.7 fcntl()函数
  • 参数:
    • fd:文件描述符。
    • cmd:命令类型。
    • arg:根据不同的命令类型可能需要的额外参数。
  • 返回值:
    • 根据不同的命令类型和操作可能返回不同的值。
  • 作用:提供了对文件描述符更加灵活的控制能力,可以用于实现各种高级的文件操作,如非阻塞IO、文件锁、文件描述符的异步通知。暂时先了解

#include <fcntl.h>
int fcntl(int fd, int cmd, ... /* arg */ );

2.8 pread()函数

  • 参数和返回值同read()函数,但可以指定读取文件的偏移量。
  • 作用:类似于read(),但可以指定读取文件的偏移量。

#include <unistd.h>
ssize_t pread(int fd, void *buf, size_t count, off_t offset);
2.9 pwrite()函数
  • 参数和返回值同write()函数,但可以指定写入文件的偏移量。
  • 作用:类似于write(),但可以指定写入文件的偏移量。

#include <unistd.h>
ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);

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

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

相关文章

vue3 + potree 渲染点云数据记录

potree 官网示例 前置条件&#xff1a; potree 无法直接加载 LAS&#xff0c;LCD&#xff0c;PLY等格式的点云文件, 需要通过 PotreeConverte 转换为 octree 数据格式&#xff0c;前端渲染中加载转换后的 json 格式 格式转换方向 .las ---- potreeConverter ----> .json…

python-常用数据结构(1)

1、从键盘输人一个正整数列表,以一1结束,分别计算列表中奇数和偶数的和。 &#xff08;1&#xff09;源代码&#xff1a; n int(input("请输入一个正整数&#xff1a;")) list [] while n ! -1: list.append(n) n int(input("请输入一个正整数&#xff1a;&…

示波器接上机器板子信号就正常工作,拿下来就机器不正常工作

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 送给大学毕业后找不到奋斗方向的你&#xff08;每周不定时更新&#xff09; 【牛客网】构建从学习到职业的良性生态圈 中国计算…

算法:计数类dp

文章目录 一、举个栗子例子1&#xff1a;爬楼梯问题例子2&#xff1a;不同路径例子3&#xff1a;计数子序列 二、基本思路三、典型例题一、ACWing&#xff1a;900. 整数划分1、解法一1.1、状态转移方程1.2、参考代码 O(n) 超时 2、解法二&#xff1a;类似完全背包问题1.1、状态…

C语言——详解字符函数和字符串函数(二)

Hi,铁子们好呀&#xff01;之前博主给大家简单地介绍了部分字符和字符串函数&#xff0c;那么这次&#xff0c;博主将会把这些字符串函数给大家依次讲完&#xff01; 今天讲的具体内容如下: 文章目录 6.strcmp函数的使用及模拟实现6.1 strcmp函数介绍和基本使用6.1.1 strcmp函…

消息队列之-----------------zookeeper机制

目录 一、ZooKeeper是什么 二、ZooKeeper的工作机制 三、ZooKeeper特点 四、ZooKeeper数据结构 五、ZooKeeper应用场景 5.1统一命名服务 5.2统一配置管理 5.3统一集群管理 5.4服务器动态上下线 5.5软负载均衡 六、ZooKeeper的选举机制 6.1第一次启动选举机制 6.2非…

uniapp极光推送、java服务端集成

一、准备工作 1、进入【服务中心】-【开发者平台】 2、【创建应用】&#xff0c;填写应用名称和图标&#xff08;填写项目名称&#xff0c;项目logo就行&#xff0c;也可填写其他的&#xff09; 3、选择【消息推送】服务&#xff0c;点击下一步 ​ ​ Demo测试 参照文档&…

第15届蓝桥STEMA测评真题剖析-2024年3月10日Scratch编程初中级组

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第180讲。 第15届蓝桥第5次STEMA测评&#xff0c;这是2024年3月10日举办的STEMA&#xff0c;比赛仍然采取线上形式。这…

达梦关键字(如:XML,EXCHANGE,DOMAIN,link等)配置忽略

背景&#xff1a;在使用达梦数据库时&#xff0c;查询SQL中涉及XML,EXCHANGE,DOMAIN,link字段&#xff0c;在达梦中是关键字&#xff0c;SQL报关键词不能使用的错误。 解决办法&#xff1a; 配置达梦安装文件E:\MyJava\dmdbms\data\DAMENG\dm.ini 忽略这些关键词&#xff0c;…

【Linux】shell 脚本基础使用

在终端中输入命令可以完成一些常用的操作&#xff0c;但是我们都是一条一条输入命令&#xff0c;比较麻烦&#xff0c;为了解决这个问题&#xff0c;就会涉及到 shell 脚本&#xff0c;它可以将很多条命令放到一个文件里面&#xff0c;然后直接运行这个文件即可。 shell 脚本类…

Jupyter Notbook如何安装配置并结合内网穿透实现无公网IP远程连接使用

文章目录 推荐1.前言2.Jupyter Notebook的安装2.1 Jupyter Notebook下载安装2.2 Jupyter Notebook的配置2.3 Cpolar下载安装 3.Cpolar端口设置3.1 Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&am…

分类预测 | Matlab实现KPCA-IDBO-LSSVM基于核主成分分析和改进蜣螂优化算法优化最小二乘支持向量机分类预测

分类预测 | Matlab实现KPCA-IDBO-LSSVM基于核主成分分析和改进蜣螂优化算法优化最小二乘支持向量机分类预测 目录 分类预测 | Matlab实现KPCA-IDBO-LSSVM基于核主成分分析和改进蜣螂优化算法优化最小二乘支持向量机分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述…

炒股自动化:交易接口API才是重点,券商官方散户可用的接口

上一篇我们用get_full_tick取到了数据&#xff0c;也讲了变量和字典的基本概念&#xff0c;这次我们向交易所发送订单试试。前面文章的链接放在文末了&#xff0c;需要的可以看一下 这些内容是给新手看的&#xff0c;找接口的大佬们直接拉到文末即可 取市场数据的方法很多&am…

【MATLAB源码-第12期】基于matlab的4FSK(4CPFSK)的误码率BER理论值与实际值仿真。

1、算法描述 4FSK在频移键控&#xff08;FSK&#xff09;编码的基础上有所扩展。FSK是一种调制技术&#xff0c;它通过在不同频率上切换来表示不同的数字或符号。而4FSK则是FSK的一种变种&#xff0c;表示使用了4个不同的频率来传输信息。 在4FSK中&#xff0c;每个数字或符号…

ONERugged车载平板电脑厂家丨工业车载电脑优势体现丨3年质保

作为现代社会中必不可少的出行工具&#xff0c;汽车不仅仅是代步工具&#xff0c;更是我们生活中的重要一部分。而在如此多功能的汽车内&#xff0c;一款高可靠性、适应不同行业应用的车载平板电脑成为了当下的热门选择。ONERugged车载平板电脑以其卓越的品质和强大的功能而备受…

post请求搜索功能爬虫

<!--爬虫仅支持1.8版本的jdk--> <!-- 爬虫需要的依赖--> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.2</version> </dependency>…

git配置多SSH

目的&#xff1a; 一台电脑可以让github、gitee等账号同时存在&#xff0c;让不同账号配置不同的密钥 第一步&#xff1a;创建不同平台的SSH公钥 执行命令&#xff1a; ssh-keygen -t rsa -C "对应仓库邮箱地址" -f ~/.ssh/id_rsa.github 如果执行上面的命令&…

头歌机器学习实验 第7次实验 局部加权线性回归

任务描述 本关任务&#xff1a;编写一个利用局部加权计算回归系数的小程序。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.局部加权算法的思想&#xff1b;2.局部加权的核心算法。 局部加权算法的思想 在局部加权算法中 &#xff0c;我们给待预测点附近…

探索设计模式的魅力:MVVM模式在AI大模型领域的创新应用-打破传统,迎接智能未来

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 MVVM模式在AI大模型领域的创新应用-打破传统迎接智能未来 &#x1f680; “在人工智能的领域里&a…

08 - 镜像管理之:镜像仓库harbor介绍

本文参考&#xff1a;原文1 1 Harbor仓库介绍 Docker容器应用的开发和运行离不开可靠的镜像管理&#xff0c;虽然Docker官方也提供了公共的镜像仓库&#xff0c;但是从安全和效率等方面考虑&#xff0c;部署我们私有环境内的Registry 也是非常必要的。 之前介绍了Docker私有仓…