写给初学者的linuxerrno错误码机制

写给初学者的Linux errno错误码机制

作为Linux系统开发或运维工作中不可或缺的一部分,errno错误码机制是初学者难以回避的知识点。本文将从errno概念和常见的错误码、errno与系统调用、errno如何获取和处理以及相关的系统工具和资源等几个方面详细介绍Linux errno错误码机制,希望能为初学者提供参考和帮助。

errno概念和常见错误码

errno是一个全局变量,用于记录当前操作系统调用(如读写文件、创建进程等)返回的错误码。在C语言中,errno通常使用一个特殊的宏"errno.h"来声明和定义,并包含了一组预定义的错误码。

常见的errno错误码有:

  • EACCES:没有足够的权限进行操作
  • EEXIST:文件已经存在
  • EINTR:操作被挂起,如Crtl+C键被按下等
  • EINVAL:参数不合法
  • ENOENT:文件或目录不存在
  • ENOMEM:内存不足

errno与系统调用

系统调用是操作系统和应用程序之间的桥梁。在Linux系统中,所有的操作都是通过系统调用来实现的。一旦系统调用失败,就会返回一个errno错误码,这时候应该根据返回值来判断系统调用是否成功。

以打开文件为例,可以使用系统调用open()来打开一个文件。通常来说,如果open()系统调用成功,它将返回一个文件描述符fd;否则,将返回-1并设置errno错误码。

#include <fcntl.h> //头文件用于open系统调用
int fd = open("file.txt", O_RDONLY);
if(fd == -1) {
    perror("open error");
    exit(1);
}

这里出现了一个新的函数perror(),用于将最后一次发生的错误输出到标准输出。出于错误处理的需要,通常应该在发生系统调用错误的时候使用perror()函数输出相关的错误信息。

errno获取和处理

errno可以通过变量errno来获取。它是一个全局变量,因此不需要参数也可以访问。errno在使用之前应该先将它初始化为0,然后可以使用它来检查相应的错误信息。

#include <errno.h>
errno = 0;
if (somefunc() == -1) {
    if (errno == ENOENT) {
        printf("Error: file does not exist");
    } else {
        printf("Error: some other error");
    }
}

系统工具和资源

对于初学者,应该使用系统提供的工具和资源来了解errno错误码机制。

系统资源:

  • "man errno":错误码列表和含义的手册页
  • "man 2 intro":一个介绍系统调用的手册页
  • 头文件"errno.h":声明和定义全局变量errno和预定义错误码

系统工具:

  • perror:将指定的errno错误码转换为人类可读的错误消息
  • strerror:将指定的errno错误码转换为字符串形式的错误消息

如何使用perror工具:

$ perror 2
OS error code   2:  No such file or directory

如何使用strerror工具:

#include <errno.h>
#include <string.h>
#include <stdio.h>

int main(void) {
    fprintf(stderr, "Value of errno: %d\n", errno);
    perror("Error printed by perror");
    fprintf(stderr, "Error opening file: %s\n", strerror(errno));
    return 0;
}

本文介绍了errno错误码的概念、常见错误码、errno与系统调用的关系、errno的获取和处理以及相应的系统工具和资源。学好errno错误码机制将有助于我们进行系统开发和日常运维工作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:写给初学者的linuxerrno错误码机制 - Python技术站

(0)
上一篇 2023年3月28日
下一篇 2023年3月28日

相关文章

  • apk反编译、smali修改、回编译笔记

    APK反编译、smali修改、回编译笔记 当我们接手一款App的时候,经常需要对其进行修改或者定制化。但是,在不授权的情况下,我们无法直接拿到源码。这时候,APK的反编译就成了一个重要的途径。本篇文章将介绍如何进行APK的反编译、smali代码修改以及回编译。 APK反编译 当我们获取到一个APK后,我们可以使用类似 jadx、ApkTool等反编译工具对其…

    其他 2023年3月28日
    00
  • DOS命令全集(二)

    DOS命令全集(二)完整攻略 常用命令说明 1. ping ping命令用于测试一个IP地址或域名是否可以访问。在命令行窗口中输入ping+需要测试的IP地址或域名,按下回车键后,系统会尝试对该地址进行四次数据包的测试。 示例:测试百度官网的连通性 ping www.baidu.com 2. netstat netstat命令用于显示当前系统的网络状态信息,…

    other 2023年6月26日
    00
  • WordPress高级自定义布局的内容编辑器(TinyMCE)模板

    WordPress高级自定义布局的内容编辑器(TinyMCE)模板攻略 简介 WordPress是一个功能强大的内容管理系统,它提供了许多自定义选项,其中之一是自定义布局的内容编辑器模板。这个模板使用了TinyMCE编辑器,它是一个可扩展的富文本编辑器,可以帮助你创建和编辑内容。 步骤 步骤一:创建自定义布局模板 打开WordPress后台,进入主题编辑器。…

    other 2023年9月5日
    00
  • excel中怎么使用index嵌套match函数?

    当在Excel中需要根据某个条件在数据范围中查找特定值时,可以使用INDEX和MATCH函数的嵌套。INDEX函数用于返回指定范围内的单元格的值,而MATCH函数用于查找某个值在指定范围内的位置。 下面是使用INDEX和MATCH函数嵌套的完整攻略: 基本语法: INDEX函数的基本语法如下: INDEX(range, row_num, [column_nu…

    other 2023年7月28日
    00
  • 关闭网站的wscript.shell命令行执行

    关闭网站的wscript.shell命令行执行指的是防止攻击者通过网站运行wscript.shell对象来执行任意命令,从而实施攻击的一种方法。以下是关闭网站wscript.shell命令行执行的完整攻略: 1. 禁止服务器上WScript.Shell对象的访问 在服务器上禁止WScript.Shell对象的访问是防止攻击者利用该对象执行任意命令的有效方法。…

    other 2023年6月26日
    00
  • mysqlsystemlock

    以下是详细讲解“MySQL系统锁(mysql_system_lock)”的完整攻略,过程中至少包含两条示例说明的标准Markdown格式文本: MySQL系统锁(mysql_system_lock) MySQL系统锁是一种用于控制并发访问的机制,它可以防止多个线程同时访问同一资源。本文将介绍MySQL系统锁的使用方法和示例。 获取系统锁 在MySQL中,可以…

    other 2023年5月10日
    00
  • ASP获取数据库表名、库名、字段名的方法

    获取数据库表名、库名、字段名是网站开发中常见的需求。在ASP中,可以通过ADO对象的属性和方法来实现。下面是具体的完整攻略: 获取数据库库名 要获取一个数据库的库名,在连接数据库的字符串(ConnectionString)中加入“Initial Catalog=数据库名”即可。然后,打开连接,通过Connection对象的属性Catalog获取库名。 示例代…

    other 2023年6月26日
    00
  • Qt5.14 与 OpenCV4.5 教程之图片增强效果

    首先,我们需要安装 Qt5.14 和 OpenCV4.5。安装过程请自行查阅相关资料。 接下来,我们开始讲解如何使用 Qt5.14 与 OpenCV4.5 实现图片增强效果。步骤如下: 准备工作 创建一个新的Qt Widgets Application项目。 在 main.cpp 文件中,添加以下代码: #include "mainwindow.h…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部