news 2026/3/4 3:53:43

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/2/25 11:15:47

工程化实践:AIGC创作者如何构建可扩展的创作工作流

引言随着AI生成内容技术的快速发展&#xff0c;越来越多的创作者开始探索将AIGC工具应用于商业化创作。然而&#xff0c;从个人实验到稳定输出&#xff0c;需要一套系统化、工程化的解决方案。本文将分享我在某AIGC创作平台上的实践经历&#xff0c;重点探讨如何构建可扩展的创…

作者头像 李华
网站建设 2026/3/4 17:51:28

Kalidokit与Three.js VRM渲染器:虚拟角色动作捕捉完整解决方案

Kalidokit与Three.js VRM渲染器&#xff1a;虚拟角色动作捕捉完整解决方案 【免费下载链接】harmonyos-tutorial HarmonyOS Tutorial. 《跟老卫学HarmonyOS开发》 项目地址: https://gitcode.com/GitHub_Trending/ha/harmonyos-tutorial 在虚拟角色应用快速发展的今天&a…

作者头像 李华
网站建设 2026/2/25 14:07:24

3倍效率提升:ThingsBoard批量管理终极指南

3倍效率提升&#xff1a;ThingsBoard批量管理终极指南 【免费下载链接】thingsboard Open-source IoT Platform - Device management, data collection, processing and visualization. 项目地址: https://gitcode.com/GitHub_Trending/th/thingsboard 你是否也曾面临这…

作者头像 李华
网站建设 2026/3/4 19:37:05

3大痛点解析:Flink监控体系为何总是失效?终极解决方案来了!

你是否经历过Flink作业突然卡死却找不到原因&#xff1f;背压监控数据一片空白&#xff1f;检查点频繁失败却无从下手&#xff1f;这些困扰开发者的监控难题&#xff0c;本文将为你一一解决&#xff01;&#x1f680; 【免费下载链接】flink 项目地址: https://gitcode.com/…

作者头像 李华
网站建设 2026/2/27 8:51:24

Latest:macOS应用更新的终极完整指南

Latest&#xff1a;macOS应用更新的终极完整指南 【免费下载链接】Latest A small utility app for macOS that makes sure you know about all the latest updates to the apps you use. 项目地址: https://gitcode.com/gh_mirrors/la/Latest Latest 是一款专为 macOS …

作者头像 李华