Linux编程笔记(三)——处理错误

处理系统调用中的错误

系统调用会遇到哪些错误呢?每个系统调用都有自己的错误集,以open为例,如果要打开的文件不存在,或者没有权限,都会报错,返回-1,但是如何确定到底是发生了哪一类具体错误呢?

确定错误种类:errno

内核通过全局变量errno来指明错误的类型,每个程序都可以访问到这个变量。

在man error(3)和<errno.h>中可以看到包含的错误代码和相应说明,例如:

1
#define EPERM 1 /*Operation not permitted*/

根据不同错误进行不同的具体处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <errno.h>
extern int errno; //需要用到errno
int sample()
{
int fd;
fd = open("file",O_RDONLY);
if(fd == -1)
{
printf("Cannot open file:");
if(errno == ENOENT)
printf("there is no such file.");
else if(errno == EINTR)
printf("Interrupted while opening file.");
...
}
}

需要根据不同的错误类型进行不同的处理。

如果打开文件不存在,那么给出提示重新输入文件名,如果打开太多文件,就关闭一些不要的,去做一些相应的处理。

显示错误信息

如果需要显示错误信息,根据不同错误代码打印相应的错误信息字符串,不需要像上面那个例子那样麻烦,简单的办法是使用perror(string)这个函数,它会自己查找错误代码,在标准错误输出中显示相应的错误信息,参数string是要同时显示出的描述性信息前缀。

例如:

1
2
3
4
5
6
7
8
9
10
11
int sample()
{
int fd;
fd = open("file",ORDONLY);
if(fd == -1)
{
perror("Cannot open file");
return;
}
...
}

当有错误发生时,会看到类似如下信息:

1
2
Cannot open file:there is no such file.
Cannot open file:Interrupted while opening file.

显示第一部分就是描述性信息前缀,第二部分是根据错误代码查到的错误提示。

或者使用<string.h>下的strerror,输出一个描述error的字符串。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>
#include<errno.h>
#include<string.h>
#include<stdlib.h>
#define MYFILE "missing.txt"
int main()
{
FILE *fin;
fin = fopen(MYFILE,"r");
if(fin == (FILE*)NULL){
printf("%s: %s\n",MYFILE,strerror(errno));
exit(-1);
}
fclose(fin);
return 0;
}

输出为:

1
missing.txt: No such file or directory

本文标题:Linux编程笔记(三)——处理错误

文章作者:Yang Shuai

发布时间:2018年06月06日 - 17:06

最后更新:2018年06月06日 - 22:06

原始链接:https://ysbbswork.github.io/2018/06/06/Linux编程笔记(三)——处理错误/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

坚持原创技术分享,您的支持将鼓励我继续创作!