写给初学者的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技术站