news 2026/6/10 20:29:20

Linux应用编程 - errno、perror()、strerror(errno)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux应用编程 - errno、perror()、strerror(errno)

目录

一、errno、perror()、strerror(errno)

二、实例

1、errno

2、perror()

3、strerror(errno)


一、errno、perror()、strerror(errno)


Linux中,errno用于存储系统调用的错误码。
定义和用途
  1. errno是一个预定义的外部整型(int)变量,通常包含在头文件中;
  2. 当系统调用或库函数发生错误时,它们通常会设置errno以指示发生了哪种错误;
  3. errno的值仅在函数失败时才会被设置,并且会覆盖之前的值;
  4. 通过检查errno的值,程序员可以确定发生了什么错误,并据此编写适当的错误处理代码;
路径:kernel/include/uapi/asm-generic/errno-base.h
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ #ifndef _ASM_GENERIC_ERRNO_BASE_H #define _ASM_GENERIC_ERRNO_BASE_H #define EPERM 1 /* Operation not permitted */ #define ENOENT 2 /* No such file or directory */ #define ESRCH 3 /* No such process */ #define EINTR 4 /* Interrupted system call */ #define EIO 5 /* I/O error */ #define ENXIO 6 /* No such device or address */ #define E2BIG 7 /* Argument list too long */ #define ENOEXEC 8 /* Exec format error */ #define EBADF 9 /* Bad file number */ #define ECHILD 10 /* No child processes */ #define EAGAIN 11 /* Try again */ #define ENOMEM 12 /* Out of memory */ #define EACCES 13 /* Permission denied */ #define EFAULT 14 /* Bad address */ #define ENOTBLK 15 /* Block device required */ #define EBUSY 16 /* Device or resource busy */ #define EEXIST 17 /* File exists */ #define EXDEV 18 /* Cross-device link */ #define ENODEV 19 /* No such device */ #define ENOTDIR 20 /* Not a directory */ #define EISDIR 21 /* Is a directory */ #define EINVAL 22 /* Invalid argument */ #define ENFILE 23 /* File table overflow */ #define EMFILE 24 /* Too many open files */ #define ENOTTY 25 /* Not a typewriter */ #define ETXTBSY 26 /* Text file busy */ #define EFBIG 27 /* File too large */ #define ENOSPC 28 /* No space left on device */ #define ESPIPE 29 /* Illegal seek */ #define EROFS 30 /* Read-only file system */ #define EMLINK 31 /* Too many links */ #define EPIPE 32 /* Broken pipe */ #define EDOM 33 /* Math argument out of domain of func */ #define ERANGE 34 /* Math result not representable */ #endif

二、实例


1、errno

#include <stdio.h> #include <errno.h> int main() { FILE*fp; fp = fopen("temp","r"); if(fp == NULL) { fprintf(stderr,"fopen() failed! errno = %d\n",errno); exit(1); } puts("OK!"); exit(0); }

运行结果:

fopen() failed! errno = 2

errno = 2 从内核定义可以看到表示没有文件或目录

#define ENOENT 2 /* No such file or directory */

直接使用errno存在一个缺陷,因为errno是一个整型数值,需要查看内核代码才能知道含义。可以使用 perror()、strerror(errno) 打印错误字符串。

2、perror()

#include <stdio.h> #include <errno.h> int main() { FILE*fp; fp = fopen("temp","r"); if(fp == NULL) { //fprintf(stderr,"fopen() failed! errno = %d\n",errno); perror("fopen() failed!"); exit(1); } puts("OK!"); exit(0); }

perror()可以直接输出错误信息,输出结果如下:

fopen() failed!: No such file or directory

3、strerror(errno)

strerror(errno)将errno错误号转化成错误字符串

#include <stdio.h> #include <errno.h> #include <string.h> int main() { FILE*fp; fp = fopen("temp","r"); if(fp == NULL) { //fprintf(stderr,"fopen() failed! errno = %d\n",errno); //perror("fopen() failed!"); fprintf(stderr,"fopen() failed! errno = %s\n",strerror(errno)); exit(1); } puts("OK!"); exit(0); }

运行结果:

fopen() failed! errno = No such file or directory

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 16:59:02

Redis 的内存回收机制详解

Redis 的内存回收机制详解 Redis 是基于内存的高性能数据库&#xff0c;但内存资源有限。当单节点内存过大时&#xff0c;不仅会增加成本&#xff0c;还可能影响 RDB/AOF 持久化 和 主从同步 的性能与稳定性。 为此&#xff0c;Redis 提供了完善的内存管理机制&#xff0c;主…

作者头像 李华
网站建设 2026/6/10 6:09:46

MCP协议中的OAuth2集成实战指南:从零构建安全认证体系

MCP协议中的OAuth2集成实战指南&#xff1a;从零构建安全认证体系 【免费下载链接】mcp-for-beginners This open-source curriculum is designed to teach the concepts and fundamentals of the Model Context Protocol (MCP), with practical examples in .NET, Java, and P…

作者头像 李华
网站建设 2026/6/10 2:57:12

基于微信小程序的垃圾分类信息系统毕业设计项目源码

基于微信小程序的垃圾分类信息系统&#xff0c;直击居民“分类标准记混、查询繁琐、投放不精准”与社区“宣传低效、数据难统计”的双重痛点&#xff0c;依托微信小程序“免安装、高触达、强传播”的优势&#xff0c;构建“智能查询知识科普互动激励”的一体化垃圾分类服务平台…

作者头像 李华
网站建设 2026/6/10 11:38:48

ChatTTS-ui Docker部署完全指南:GPU与CPU版本一键配置

ChatTTS-ui Docker部署完全指南&#xff1a;GPU与CPU版本一键配置 【免费下载链接】ChatTTS-ui 匹配ChatTTS的web界面和api接口 项目地址: https://gitcode.com/GitHub_Trending/ch/ChatTTS-ui 还在为AI语音合成项目ChatTTS-ui的复杂环境配置而头疼吗&#xff1f;CUDA版…

作者头像 李华
网站建设 2026/6/10 11:39:22

Windows功能组件手动部署:解决系统兼容性问题的完整指南

Windows功能组件手动部署&#xff1a;解决系统兼容性问题的完整指南 【免费下载链接】已解决Win11离线安装.NETFramework3.5完全指南 【已解决】Win11离线安装.NET Framework 3.5完全指南 项目地址: https://gitcode.com/Resource-Bundle-Collection/d5cb0 你是否曾经遇…

作者头像 李华
网站建设 2026/6/10 11:39:30

新手小白之C#数组查询技巧全解析

//查询目的 &#xff1a;通过数组查询一些满足条件&#xff08;相等、不等等&#xff09;的元素//有些方法属于Array静态的方法 使用Array.方法&#xff08;&#xff09;//有些方法属于非静态的方法 使用对象.方法名&#xff08;&#xff09;&#xff0c;需要先去创建对象int[]…

作者头像 李华