1、errno
内核通过全局变量errno来指明错误的类型,每个程序都可以访问到这个变量。
2、如果open无法打开指定的文件,它会返回-1,同样的,当read无法读的时候,它会返回-1,当lseek无法指定指针位置时,它会返回-1,-1表示在系统调用中出现了某些问题。
3、每个系统调用都有自己的错误集。以open为例,如果要打开的文件不存在,或者虽然存在,但没有读的权限,或者已经打开的文件太多,都会导致系统报错。而错误的类型就被赋值给了errno变量,通过查看errno的值,来确定错位类型。
4、man errno
5、man open
6、根据上面的5,可有如下代码:
#include<stdio.h>
#include<fcntl.h>
#include<errno.h>
extern int errno;
int main() {
int fd;
fd = open("hhh", O_RDONLY);
if (fd == -1) {
printf("Cannot open file:");
if (errno == ENOENT) {
printf("There is no such file.\n");
} else if (errno == EINTR) {
printf("Interrupted while opening file.\n");
} else if (errno == EACCES) {
printf("You do not have permission to open file\n");
}
}
return 0;
}
如果要打开的文件不存在,那么给出提示重新输入文件名,如果已经打开的文件太多,那就关闭一些不需要的文件,这种情况下是不需要给用户任何提示的。
7、perror
perror(string)标准错误输出,它会自己查找错误代码,在标准错误输出中显示相应的错误信息,参数string是同时要显示出的描述性信息。
perror是比上面的6更简便的方法。
8、使用perror的参考代码如下:
#include<stdio.h>
#include<fcntl.h>
int main() {
int fd;
fd = open("hhh", O_RDONLY);
if (fd == -1) {
perror("Cannot open file");
}
return 0;
}
错误信息中,第一部分是用户传递进去的描述性信息,第二部分是根据错误代码查到的错误提示。