Linux错误代码获取相应的错误描述

错误代码获取相应的错误描述

使用strerror()

要从错误代码获取到相应的错误描述, 可以使用strerror()函数得到错误信息的字符串, 打印即可

strerror() 是一个 C 语言标准库函数,用于将errno错误码转换为对应的错误信息字符串。

如例:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>

/*自定义的错误处理函数*/
void my_err(const char * err_string, int line)
{
	fprintf(stderr, "line:%d  ", line);
	//perror(err_string);
    //perror(NULL);
	printf("\nerr:%s errno:%d\n", strerror(errno), errno);
	exit(1);
}

/*自定义的读数据函数*/
int my_read(int fd)
{
	int		len;
	int		ret;
	int		i;
	char	read_buf[64];

	/*获取文件长度并保持文件读写指针在文件开始处*/
	if (lseek(fd, 0, SEEK_END) == -1) {
		my_err("lseek", __LINE__);
		/* __LINE__ 是一个预定义宏,表示当前代码所在的行号,用于获取错误发生的位置 */
	}
	if ((len = lseek(fd, 0, SEEK_CUR)) == -1) { // 前一个lseek调用已经将读写指针指向文件末尾
		my_err("lseek", __LINE__);
	}
	if ((lseek(fd, 0, SEEK_SET)) == -1) { // 指向文件开头
		my_err("lseek", __LINE__);
	}
	
	printf("len:%d\n", len); // 在进行实验时成功执行了此条命令,说明前面成功读取文件长度,并指向文件开头
	/*读数据*/
	if ((ret = read(fd, read_buf, len)) < 0) { // 将整个文件复制进read_buf
		my_err("read", __LINE__);
	}
	
	/*打印数据*/
	for (i=0; i<len; i++) {
		printf("%c", read_buf[i]);
	}
	printf("\n");

	return ret;
}

int main()
{
	int	fd;
	char 	write_buf[32] = "Hello World!";

	/*在当前目录下创建文件example_63.c*/
	if ((fd = creat("example_63.c", S_IRWXU)) == -1) {
	//if ((fd = open("example_63.c", O_RDWR|O_CREAT|O_TRUNC, S_IRWXU)) == -1) {
		my_err("open", __LINE__);
	} else {
		printf("create file success\n");
	}
	
	/*写数据*/
	if (write(fd, write_buf, strlen(write_buf)) != strlen(write_buf)) {
		my_err("write", __LINE__);
	}
	my_read(fd);

	/*演示文件的间隔*/
	printf("/*--------------------*/\n");
	if (lseek(fd, 10, SEEK_END) == -1) {
		my_err("lseek", __LINE__);
	}
	if (write(fd, write_buf, strlen(write_buf)) != strlen(write_buf)) {
		my_err("write", __LINE__);
	}
	my_read(fd);
	
	close(fd);
	return 0;
} 

# 结果
create file success
len:12
line:41  
err:Bad file descriptor errno:9

关于perror()

perror()是一个 C 语言标准库函数,用于将__最近__的一次系统调用错误信息输出到标准错误流 stderr,并附加一个自定义的错误信息前缀。

perror()函数的参数 err_string 是一个字符串指针,用于指定输出的错误信息前缀。如果 err_string 为 NULL,则只输出系统调用错误信息,不添加前缀。

让我们将例子中my_err函数的printf注释掉, 换用perror的结果如下:

# perror(err_string)
create file success
len:12
line:38  read: Bad file descriptor

# perror(NULL)
create file success
len:12
line:42  Bad file descriptor

额外的小知识

_LINE_

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Linux内核的ext4文件系统是一种高性能、可靠的文件系统,是ext3文件系统的升级版。它可以支持更大的文件和更大的文件系统,并提供更高的性能和更好的可靠性。下面是对ext4文件系统代码的详细讲解: 1. 文件系统初始化 文件系统初始化是ext4文件系统的第一步。在初始化过程中,文件系统会创建超级块、块组描述符表、inode表、位图和根目录等基本数据结构。其中,超级块是文件系统的核心数据结构,它记录了文件系统的各种属性和参数,如文件系统的大小、块大小、inode数量、挂载时间等。块组描述符表记录了每个块组的信息,如块组的起始位置、块位图的位置、inode位图的位置等。inode表记录了文件和目录的元数据,如文件大小、访问权限、创建时间等。位图记录了块和inode的分配情况。根目录是文件系统的根节点,它包含了所有文件和目录的入口。 2. 块和inode的分配 在ext4文件系统中,块和inode的分配是通过位图实现的。当文件系统需要分配一个块或inode时,它会在位图中查找空闲的块或inode,并将其标记为已分配。如果位图中没有空闲的块或inode,则文件系统会尝试从其他块组中获取。 3. 目录的管理 在ext4文件系统中,目录是一种特殊的文件,它包含了其他文件和目录的入口。在目录中,每个文件和目录都对应一个inode,它记录了文件和目录的元数据。当一个新的文件或目录被创建时,文件系统会为其分配一个inode,并在目录中添加一个新的入口。当一个文件或目录被删除时,文件系统会从目录中删除相应的入口,并释放对应的inode和块。 4. 文件的读写 在ext4文件系统中,文件的读写是通过文件系统缓存和块缓存实现的。当一个文件被打开时,文件系统会将其缓存到内存中,并将文件指针定位到文件的起始位置。当文件被读取时,文件系统会从文件的缓存中读取数据,并将文件指针向后移动。当文件被写入时,文件系统会将数据写入到块缓存中,并将文件指针向后移动。当文件被关闭时,文件系统会将文件的缓存写回到磁盘中。 5. 日志记录 在ext4文件系统中,日志记录是一种重要的机制,它可以保证文件系统的可靠性和一致性。在文件系统的操作中,如文件的读写、块和inode的分配、目录的管理等,都会被记录到日志中。如果在操作过程中出现了错误或系统崩溃,文件系统可以通过日志恢复机制来恢复文件系统的状态。 总结: 以上是对Linux内核的ext4文件系统代码的详细讲解。通过对文件系统初始化、块和inode的分配、目录的管理、文件的读写和日志记录等方面的分析,可以更好地理解文件系统的实现原理和工作机制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值