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.mzph.cn/news/807829.shtml

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

相关文章

Pytest精通指南(04)前后置和测试用例执行优先级

文章目录 Pytest 固件核心概念Pytest 固件原理Pytest 固件分类方法级函数级类级模块级夹具优先级测试用例执行优先级固件不仅如此后续大有文章 Pytest 固件核心概念 在 pytest 测试框架中&#xff0c;固件是一个核心概念&#xff1b; 它是一种特殊的函数&#xff0c;用于在测试…

蓝桥杯物联网竞赛_STM32L071KBU6_全部工程及国赛省赛真题及代码

包含stm32L071kbu6全部实验工程、源码、原理图、官方提供参考代码及国、省赛真题及代码 链接&#xff1a;https://pan.baidu.com/s/1pXnsMHE0t4RLCeluFhFpAg?pwdq497 提取码&#xff1a;q497

【Python】报错ModuleNotFoundError: No module named fileName解决办法

1.前言 当我们导入一个模块时&#xff1a; import xxx &#xff0c;默认情况下python解释器会搜索当前目录、已安装的内置模块和第三方模块。 搜索路径存放在sys模块的path中。【即默认搜索路径可以通过sys.path打印查看】 2.sys.path.append() sys.path是一个列表 list ,它里…

JVM常用参数一

jvm启动参数 JVM&#xff08;Java虚拟机&#xff09;的启动参数是在启动JVM时可以设置的一些命令行参数。这些参数用于指定JVM的运行环境、内存分配、垃圾回收器以及其他选项。以下是一些常见的JVM启动参数&#xff1a; -Xms&#xff1a;设置JVM的初始堆大小。 -Xmx&#xff1…

证书生成和获取阿里云备案获取密钥流程

1.在java文件夹下 输入 cmd 打开命令行窗口 2. keytool -genkey -alias 证书名 -keyalg RSA -keysize 2048 -validity 36500 -keystore 证书名.keystore 输入这一行&#xff0c;把证书名三个字 改成 项目的名称&#xff08;例如&#xff1a;D23102802&#xff09; 3. 密码默认填…

天工 AI 爆赞的数据分析能力

分享一个 AI 应用。 天工 AI 天工AI - 首页 (tiangong.cn) 可以上传数据&#xff0c;给出数据分析命令&#xff0c;并能出图。 数据分析师岌岌可危。 又知道其他好用的数据分析应用么&#xff0c;可以告诉我下。

vscode + wsl1 搭建远程C/C++开发环境

记录第一次搭建环境过程。 如何选择开发环境 搭建C/C开发环境有很多种方式&#xff0c;如 MinGW vscode&#xff08;MinGW 是GCC的Windows版本&#xff0c;本地编译环境&#xff09;SSH隧道连接 vscode&#xff08;远程Linux主机&#xff09;wsl vscode&#xff08;远程Li…

Axios网络请求

Axios网络请求主要用于前后端请求&#xff0c;前后端分离时前端需要通过url请求后端的接口&#xff0c;并且处理后端传过来的数据。 Axios官网教程 安装 npm install axios在main.js导入 import axios from axios;//声明一个http变量&#xff01;&#xff01;&#xff01…

初步了解Zookeeper

目录 1. Zookeeper定义 2. Zookeeper工作机制 3. Zookeeper特点 4. Zookeeper数据结构 5. Zookeeper应用场景 5.1 统一命名服务 5.2 统一配置管理 5.3 统一集群管理 5.4 服务器动态上下线 5.5 软负载均衡 6. Zookeeper 选举机制 6.1 第一次启动选举机制 6.2 非第一…

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

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

【Python数据分析】让工作自动化起来,无所不能的Python

这里写目录标题 前言一、Python是办公自动化的重要工具二、Python是提升职场竞争力的利器三、Python是企业数字化的重要平台四、Python是AI发展的重要通道之一编辑推荐内容简介作者简介前言读者对象如何阅读本书目录 前言 随着我国企业数字化和信息化的深入&#xff0c;企业对…

大屏可视化展示平台解决方案(word原件获取)

1.系统概述 1.1.需求分析 1.2.重难点分析 1.3.重难点解决措施 2.系统架构设计 2.1.系统架构图 2.2.关键技术 2.3.接口及要求 3.系统功能设计 3.1.功能清单列表 3.2.数据源管理 3.3.数据集管理 3.4.视图管理 3.5.仪表盘管理 3.6.移动端设计 3.1.系统权限设计 3.2.数据查询过程设…

【论文阅读】MCTformer: 弱监督语义分割的多类令牌转换器

【论文阅读】MCTformer: 弱监督语义分割的多类令牌转换器 文章目录 【论文阅读】MCTformer: 弱监督语义分割的多类令牌转换器一、介绍二、联系工作三、方法四、实验结果 Multi-class Token Transformer for Weakly Supervised Semantic Segmentation 本文提出了一种新的基于变换…

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

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

Java前置一些知识

文章目录 搭建Java环境安装path环境变量Java技术体系 Java执行原理JDK组成跨平台Java内存分配 IDEA管理Java程序 搭建Java环境 安装 oralce官网下载 JDK17 Windows 傻瓜式的点下一步就行&#xff0c;注意&#xff1a;安装目录不要有空格、中文 java 执行工具 javac 编译工具…

MWeb Pro For Mac v4.5.9 强大的 Markdown 软件中文版

MWeb 是专业的 Markdown 写作、记笔记、静态博客生成软件&#xff0c;目前已支持 Mac&#xff0c;iPad 和 iPhone。MWeb 有以下特色&#xff1a; 软件下载&#xff1a;MWeb Pro For Mac v4.5.9 软件本身&#xff1a; 使用原生的 macOS 技术打造&#xff0c;追求与系统的完美结合…

为什么需要网络切片?

网络切片是电信领域的一个突破性概念&#xff0c;它允许将物理网络基础设施划分为多个虚拟网络&#xff0c;称为切片。每个切片作为一个独立的网络运行&#xff0c;拥有自己的专用资源和定制的特性&#xff0c;满足不同应用、行业或用户的特定需求。 将网络切片视为在共享物理…

Linux云计算之Linux基础3——Linux系统基础part-2

1、终端、shell、文件理论 1、终端 终端(terminal)&#xff1a;人和系统交互的必要设备&#xff0c;人机交互最后一个界面&#xff08;包含独立的输入输出设备&#xff09; 物理终端(console)&#xff1a;直接接入本机器的键盘设备和显示器虚拟终端(tty)&#xff1a;通过软件…

数据绑定多级对象属性时的报错解决

数据绑定多级对象属性时的报错解决 &#xff08;1&#xff09;例子如下&#xff1a; &#xff08;2&#xff09;当syncObjForm被后台数据赋值时&#xff0c;会产生报错&#xff1a; &#xff08;3&#xff09;原因就是&#xff1a; 模板在渲染时&#xff0c;读取对象中的某个…

普通人怎么赚钱?2024普通人做什么好?2024创业项目小成本!2024创业新项目新商机!2024做什么行业前景好?

普通人真的想赚钱&#xff0c;必须得去赚看得见的钱。什么是看得见的钱&#xff1f;打个比方卖一份炒粉&#xff0c;成本是三块&#xff0c;卖十块钱&#xff0c;一天卖出去100份&#xff0c;那一天就赚700块钱&#xff0c;而不是去跟人合伙&#xff0c;你连钱都没赚到&#xf…