linux应用:errno、perror、open、fopen
errno
errno 是一个全局变量,定义在 头文件中。当系统调用(如 open、read、write 等)或库函数执行失败时,会将一个错误码赋值给 errno。不同的错误码代表不同的错误类型,通过检查 errno 的值,可以判断具体发生了什么错误。
#include <iostream>
#include <fcntl.h>
#include <unistd.h>
#include <cerrno>int main() {// 尝试打开一个不存在的文件int fd = open("nonexistent_file.txt", O_RDONLY);if (fd == -1) {// 检查 errno 的值if (errno == ENOENT) {std::cerr << "The file does not exist. errno value: " << errno << std::endl;} else {std::cerr << "An unknown error occurred. errno value: " << errno << std::endl;}}return 0;
}
代码中使用 open 函数尝试打开一个不存在的文件。由于文件不存在,open 函数会执行失败并返回 -1。
当 open 函数返回 -1 时,通过检查 errno 的值来判断具体的错误类型。ENOENT 是一个预定义的错误码,表示文件或目录不存在。如果 errno 等于 ENOENT,则输出相应的错误信息。
perror
perror 是一个函数,定义在 头文件中。它会根据 errno 的当前值,输出一条对应的错误信息。perror 函数接受一个字符串作为参数,该字符串会被作为错误信息的前缀输出。
#include <iostream>
#include <fcntl.h>
#include <unistd.h>
#include <cstdio>int main() {// 尝试打开一个不存在的文件int fd = open("nonexistent_file.txt", O_RDONLY);if (fd == -1) {// 使用 perror 输出错误信息perror("Failed to open the file");}return 0;
}
同样,代码中使用 open 函数尝试打开一个不存在的文件,由于文件不存在,open 函数执行失败并返回 -1。
当 open 函数返回 -1 时,调用 perror 函数并传入一个字符串 “Failed to open the file” 作为前缀。perror 函数会根据 errno 的当前值,输出一条包含前缀和具体错误信息的错误消息,例如:Failed to open the file: No such file or directory。
#include <iostream>
#include <fcntl.h>
#include <unistd.h>
#include <cerrno>
#include <cstdio>int main() {// 尝试打开一个不存在的文件int fd = open("nonexistent_file.txt", O_RDONLY);if (fd == -1) {// 先使用 perror 输出错误信息perror("Open file error");// 再根据 errno 进行具体处理switch (errno) {case ENOENT:std::cerr << "The file does not exist." << std::endl;break;case EACCES:std::cerr << "Permission denied." << std::endl;break;default:std::cerr << "An unknown error occurred." << std::endl;break;}}return 0;
}
errno 和 perror 的使用。当 open 函数执行失败时,首先调用 perror 函数输出一条包含前缀和通用错误信息的错误消息。
然后,通过 switch 语句根据 errno 的具体值进行更细致的错误处理,输出不同的错误提示信息,方便开发者进行调试和问题定位。
文件IO和标准IO的区别
文件 I/O(File I/O)和标准 I/O(Standard I/O)是在编程中进行输入输出操作的两种不同方式,它们在多个方面存在区别,下面为你详细介绍:
1. 接口层面
文件 I/O
系统调用接口:文件 I/O 使用的是操作系统提供的系统调用函数,这些函数直接与操作系统内核进行交互。在 Linux 系统中,常见的文件 I/O 函数有 open、read、write、lseek 和 close 等。这些函数是操作系统内核的一部分,不同的操作系统可能会有不同的实现细节。
低级别操作:由于直接与内核交互,文件 I/O 提供了更底层的操作方式,允许程序员对文件的读写位置、读写权限等进行更精确的控制。
标准 I/O
库函数接口:标准 I/O 是 C 标准库提供的一组函数,如 fopen、fread、fwrite、fseek 和 fclose 等。这些函数是在文件 I/O 的基础上进行了封装,提供了更高级、更方便的接口。
跨平台性:标准 I/O 函数是 C 标准库的一部分,具有很好的跨平台性,在不同的操作系统上都能保持一致的使用方式。
2. 缓冲机制
文件 I/O
无缓冲或自定义缓冲:文件 I/O 默认情况下是无缓冲的,即每次调用 read 或 write 函数都会直接进行系统调用,与磁盘进行数据交互。不过,程序员可以自己实现缓冲机制来提高效率,例如使用 read 函数一次性读取较大的数据块到缓冲区,然后再进行处理。
适合实时性要求高的场景:由于无缓冲,文件 I/O 能够立即将数据写入磁盘或从磁盘读取数据,适合对实时性要求较高的场景,如日志记录、设备驱动等。
标准 I/O
自动缓冲:标准 I/O 提供了自动缓冲机制,分为全缓冲、行缓冲和无缓冲三种类型。全缓冲是指当缓冲区满时才进行实际的 I/O 操作;行缓冲是指当遇到换行符时才进行 I/O 操作;无缓冲则是每次操作都立即进行 I/O。
提高效率:自动缓冲机制减少了系统调用的次数,提高了 I/O 操作的效率。例如,在向文件写入大量数据时,标准 I/O 会先将数据写入缓冲区,当缓冲区满时再一次性将数据写入磁盘,减少了磁盘 I/O 的次数。
3. 文件定位
文件 I/O
使用 lseek 函数:文件 I/O 通过 lseek 函数来定位文件的读写位置。lseek 函数可以将文件指针移动到指定的偏移量处,支持相对当前位置、文件开头和文件末尾三种偏移方式。
灵活性高:lseek 函数提供了较高的灵活性,程序员可以根据需要精确地控制文件指针的位置,实现随机读写操作。
标准 I/O
使用 fseek 函数:标准 I/O 使用 fseek 函数来定位文件的读写位置。fseek 函数的功能与 lseek 类似,但它是基于标准 I/O 流的,使用起来更加方便。
与缓冲机制结合:由于标准 I/O 有缓冲机制,fseek 函数在移动文件指针时会处理缓冲区的内容,确保数据的一致性。
4. 错误处理
文件 I/O
使用 errno:文件 I/O 函数在执行失败时会设置全局变量 errno,通过检查 errno 的值可以判断具体的错误类型。同时,还可以使用 perror 函数输出更详细的错误信息。
底层错误信息:errno 提供的错误信息比较底层,与操作系统的具体实现相关,对于一些复杂的错误,需要对操作系统有一定的了解才能准确判断。
标准 I/O
返回值和 ferror 函数:标准 I/O 函数通过返回值来表示操作是否成功,例如 fread 和 fwrite 函数返回实际读写的元素个数,如果返回值与预期不符,则表示操作失败。此外,还可以使用 ferror 函数检查流是否发生错误。
高级错误处理:标准 I/O 提供的错误处理方式相对更高级,更易于理解和使用,适合初学者。
5. 适用场景
文件 I/O
系统编程:在进行系统编程、设备驱动开发等需要直接与操作系统内核交互的场景中,文件 I/O 是首选。例如,开发一个磁盘文件系统的工具,需要精确控制文件的读写和定位,使用文件 I/O 可以更好地满足需求。
实时性要求高的场景:对于实时性要求较高的应用,如日志记录、网络编程等,文件 I/O 的无缓冲特性可以确保数据及时写入磁盘或发送到网络。
标准 I/O
通用文件处理:在一般的文件处理场景中,如文本文件的读写、数据的存储和读取等,标准 I/O 的自动缓冲机制和高级接口可以提高开发效率,减少代码复杂度。
跨平台开发:由于标准 I/O 具有良好的跨平台性,在需要编写跨操作系统的程序时,使用标准 I/O 可以确保代码的可移植性。
示例代码对比
文件 I/O 示例
#include <iostream>
#include <fcntl.h>
#include <unistd.h>int main() {const char* filename = "test.txt";const char* data = "Hello, File I/O!";// 打开文件int fd = open(filename, O_CREAT | O_WRONLY, 0666);if (fd == -1) {std::cerr << "Failed to open the file." << std::endl;return 1;}// 写入数据ssize_t bytesWritten = write(fd, data, sizeof(data));if (bytesWritten == -1) {std::cerr << "Failed to write to the file." << std::endl;close(fd);return 1;}// 关闭文件close(fd);return 0;
}
标准 I/O 示例
#include <iostream>
#include <cstdio>int main() {const char* filename = "test.txt";const char* data = "Hello, Standard I/O!";// 打开文件FILE* file = fopen(filename, "w");if (file == nullptr) {std::cerr << "Failed to open the file." << std::endl;return 1;}// 写入数据size_t bytesWritten = fwrite(data, sizeof(char), sizeof(data), file);if (bytesWritten != sizeof(data)) {std::cerr << "Failed to write to the file." << std::endl;fclose(file);return 1;}// 关闭文件fclose(file);return 0;
}
相关文章:
linux应用:errno、perror、open、fopen
errno errno 是一个全局变量,定义在 头文件中。当系统调用(如 open、read、write 等)或库函数执行失败时,会将一个错误码赋值给 errno。不同的错误码代表不同的错误类型,通过检查 errno 的值,可以判断具体…...
网络原理--HTTP协议
http中文名为超文本传输协议,所谓“超文本”就是指传输范围超出了能在UTF8等码表上找到的字符的范围,包含一些图片,特殊格式之类的。 HTTP的发展简介 从图中可以看出到现在已经发展出了HTTP3,但是市面上的主流还是以HTTP1.0为主。…...
编译可以在Android手机上运行的ffmpeg程序
下载代码 git clone gitgithub.com:FFmpeg/FFmpeg.git git checkout n7.0建立build目录 mkdir build cd build创建build.sh脚本 vim build.sh这段脚本的主要功能是配置和编译 FFmpeg,使其能够在 Android 平台上运行,通过设置不同的架构和 API 级别&am…...
华为hcia——Datacom实验指南——配置手工模式以太网链路聚合
什么是以太网链路聚合(Eth-trunk) 是一种将多个物理链路捆绑在一起,让设备以为是一条大链路,能够增加带宽,增加冗余度,提升可靠性,实现负载平衡。 传输方式有两种 基于数据流传输和基于数据包…...
【C语言6】数组和函数实践:扫雷游戏的简单实现
文章目录 一、扫雷游戏分析和设计1.1 扫雷游戏的功能说明1.2 游戏的分析和设计1.2.1 数据结构的分析1.2.2 文件结构设计 二、扫雷游戏的代码实现三、扫雷游戏的扩展总结 一、扫雷游戏分析和设计 1.1 扫雷游戏的功能说明 使用控制台实现经典的扫雷游戏游戏可以通过菜单实现继续…...
LeetCode 热题 100----1.两数之和
LeetCode 热题 100----1.两数之和 题目描述 我的解法 语言:js 思路就是:用双重循环去找哪两个数字相加等于target,目前的时间复杂度为O(n2),之后右优化思路再更新。...
《模式和状态管理》知识总结三-EcuM与BswM模块的交互
前言 这篇文章主要搞清楚在模式管理中,BswM和EcuM各自的分工。距离学完模式管理也有几天时间了,写这篇文章算是复习一下。 EcuM及BswM交互总览 EcuM负责Ecu的上下电状态的处理,当Ecu处于正常运行状态的时候,EcuM会将Ecu的控制权…...
RK3568平台(网络篇)RTL8111网卡
RTL8111 是 Realtek 推出的一款高性能千兆以太网控制器芯片,广泛应用于 PCIE 网卡中。 其工作原理涉及 数据链路层 和 物理层 的协同工作,以下是其核心原理的详细说明: 一.网卡的基本功能 1.数据封装与解封装: 网卡负责将计算机中的数据封装成网络传输的帧(Frame),并…...
客户需求模糊或频繁变更怎么办
应对客户需求模糊或频繁变更的关键在于 明确沟通、敏捷应对、科学决策。其中,明确沟通尤为重要,因为通过有效沟通,不仅能迅速厘清客户真实需求,还能及时发现隐藏问题,降低项目风险,为后续调整提供有力数据支…...
动静态库-Linux 学习
在软件开发中,程序库是一组预先编写好的程序代码,它们存储了常用的函数、变量和数据结构等。这些库可以帮助开发者节省大量的时间和精力,避免重复编写相同的代码。当我们在 Linux 系统中开发程序时,经常会用到两种类型的程序库&am…...
DeepSeek 系列模型:论文精读《A Survey of DeepSeek Models》
引言:一篇快速了解 DeepSeek 系列的论文。我在翻译时加入了一些可以提高 “可读性” 的连词 ✅ NLP 研 2 选手的学习笔记 笔者简介:Wang Linyong,NPU,2023级,计算机技术 研究方向:文本生成、大语言模型 论文…...
Python解决“找出整形数组中占比超过一半的数”问题
这里写目录标题 问题描述测试样例解决思路代码法1法2 问题描述 小R从班级中抽取了一些同学,每位同学都会给出一个数字。已知在这些数字中,某个数字的出现次数超过了数字总数的一半。现在需要你帮助小R找到这个数字。 测试样例 样例1: 输入&…...
机器人学习模拟框架 robosuite (3) 机器人控制代码示例
Robosuite框架是一个用于机器人模拟和控制的强大工具,支持多种类型的机器人。 官方文档:Overview — robosuite 1.5 documentation 开源地址:https://github.com/ARISE-Initiative/robosuite 目录 1、通过键盘或SpaceMouse远程控制机器人…...
kakfa-3:ISR机制、HWLEO、生产者、消费者、核心参数负载均衡
1. kafka内核原理 1.1 ISR机制 光是依靠多副本机制能保证Kafka的高可用性,但是能保证数据不丢失吗?不行,因为如果leader宕机,但是leader的数据还没同步到follower上去,此时即使选举了follower作为新的leaderÿ…...
【微知】如何查看Mellanox网卡上的光模块的信息?(ethtool -m enp1s0f0 看型号、厂商、生产日期等)
背景 服务器上插入的光模块经常被忽略,往往这里是定位问题最根本的地方。如何通过命令查看? 命令 ethtool提供了-m参数,m是module-info的意思,他是从光模块的eeprom中读取数据。(应该是用i2c协议读取的)…...
yum源选要配置华为云的源,阿里云用不了的情况
curl -O /etc/yum.repos.d/CentOS-Base.repo https://repo.huaweicloud.com/repository/conf/CentOS-7-reg.repo...
nginx accesslog 打印自定义header
比如我在请求的header中添加了一个path-match-type,那我现在nginx的accesslog 中打印出来,应该如何配置呢? rootnginx-59f5d66df6-jw5k8:/# cat /etc/nginx/nginx.conf user nginx; worker_processes auto;error_log /var/log/nginx/erro…...
好数——前缀和思想(题目分享)
今天我的舍友去参加“传智杯”广东省的省赛,跟我说了这样一道题,他说他想不出来怎么去优化代码,怎么做都是套用两层for循环超时,下面我就根据题意,使用前缀和的算法去优化一下思路,题目本身是不难的&#x…...
MWC 2025 | 移远通信大模型解决方案加速落地,引领服务机器人创新变革
随着人工智能、大模型等技术的蓬勃发展,生成式AI应用全面爆发。在此背景下,服务机器人作为大模型技术在端侧落地的关键场景,迎来了前所未有的发展机遇。 作为与用户直接交互的智能设备,服务机器人需要应对复杂场景下的感知、决策和…...
【大模型基础_毛玉仁】0.概述
更多内容:XiaoJ的知识星球 【大模型基础_毛玉仁】 系列文章参考 系列文章 【大模型基础_毛玉仁】0.概述 【大模型基础_毛玉仁】1.1 基于统计方法的语言模型 更新中。。。。。。 参考 书籍:大模型基础_完整版.pdf Github:https://github.co…...
ADB、Appium 和 大模型融合开展移动端自动化测试
将 ADB、Appium 和 大模型(如 GPT、LLM) 结合,可以显著提升移动端自动化测试的智能化水平和效率。以下是具体的实现思路和应用场景: 1. 核心组件的作用 ADB(Android Debug Bridge): 用于与 Android 设备通信,执行设备操作(如安装应用、获取日志、截图等)。Appium: 用…...
springboot425-基于SpringBoot的BUG管理系统(源码+数据库+纯前后端分离+部署讲解等)
💕💕作者: 爱笑学姐 💕💕个人简介:十年Java,Python美女程序员一枚,精通计算机专业前后端各类框架。 💕💕各类成品Java毕设 。javaweb,ssm…...
Ubuntu系统上部署Node.js项目的完整流程
以下是在Ubuntu系统上部署Node.js项目的完整流程,分为系统初始化、环境配置、项目部署三个部分: 一、系统初始化 & 环境准备 bash # 1. 更新系统软件包 sudo apt update && sudo apt upgrade -y# 2. 安装基础工具 sudo apt install -y buil…...
X Window---图形接口
摘抄自 鸟哥的linux私房菜 基础篇 第四版 有鉴于图形用户接口(Graphical User Interface, GUI) 的需求日益加重,在 1984 年由 MIT 与其他第三方首次发表了 X Window System ,并且更在 1988 年成立了非营利性质的 XFree86 这个组织。所谓的XFree86 其实是…...
数据序列化协议 Protobuf 3 介绍(Go 语言)
Protobuf 3 入门 1. 什么是序列化? 1.1 概念 序列化(Serialization 或 Marshalling) 是指将数据结构或对象的状态转换成可存储或传输的格式。反向操作称为反序列化(Deserialization 或 Unmarshalling),它…...
FineReport 操作注意
1.父单元格重复的时候,如何取消合并 效果如下: 只需要在单元格中,将数据设置为【列表】即可。 2.待定...
3D手眼标定转换详细实施步骤及原理概述
3D手眼标定转换详细实施步骤及原理概述 一、手眼标定的核心目标二、3D手眼标定的原理概述一、基本概念与坐标系定义**二、数学建模与方程推导****1. 坐标变换的齐次矩阵表示****2. 手眼标定方程推导** **三、方程求解方法****1. 分离旋转与平移****2. 旋转矩阵求解****3. 平移向…...
Verilog:SCCB控制器
目录 一、SCCB协议 (1)SCCB时序 (2)与I2C的区别 二、Verilog 实现 (1)设计要求 (2)设计要点 (3)模块完整代码 三、功能验证 (1)写…...
维度建模基础篇:从理论到核心组件解析
维度建模基础篇:从理论到核心组件解析 引言 在数据仓库与商业智能(BI)领域,维度建模(Dimensional Modeling)作为一种经典的数据组织方法论,自Kimball提出以来,已成为构建高效分析型系统的核心范式1,2,3。其以业务需求为导向,通过事实表与维度表的组合,实现对复杂…...
与中国联通技术共建:通过obdiag分析OceanBase DDL中的报错场景
中国联通软件研究院(简称联通软研院)在全面评估与广泛调研后,在 2021年底决定采用OceanBase 作为基础,自研分布式数据库产品CUDB(即China Unicom Database,中国联通数据库)。目前,该…...
