
最近分析了一个偶然的问题,发生的可能性特别低,并且该问题仍在分析中. 总结所分析的知识,然后继续添加.
调用Lua require函数时,该代码具有异常. 通过查看require的源代码跟踪,发现该函数的fopen函数返回了无法打开文件的异常,
以下是使用fopen打开文件时出错的可能原因的总结,也许它不完整fopen返回值,欢迎添加.
功能原型FILE * fopen(const char * path,const char * mode);
函数功能打开文件
参数: 路径[输入]名称模式[输入]的打开方法
返回值: 成功打开文件后fopen返回值,将返回指向流的文件指针. 如果文件打开失败,则返回NULL并将错误代码存储在errno中.
注意: 这只是对该功能和功能参数的简要介绍. 此处不分析具体参数的含义.
1参数路径错误. 如果路径不正确,则fopen将返回失败.

分析: 首先检查路径文件是否存在,然后检查路径是相对路径还是绝对路径. 如果是相对路径,请检查是否将切换当前进程的目录,并且软件找不到该文件.
例如,相对路径FILE * fp = fopen(“ ./ test / 1.txt”,“ r”);
绝对路径文件* fp = fopen(“ / mnt / text / 1.txt”,“ r”);
如果确定参数路径正确,则可以排除文件不存在的路径问题. 此时,您可以打印错误代码errno来定位问题(稍后介绍).
2参数模式问题,模式控制文件的打开方式,如果用户以超出当前用户权限的方式打开文件,则fopen也将返回失败,
这时,您应该检查当前用户的操作权限,或者可以打印错误代码errno来查找问题
如果当前用户仅具有读取权限,并且通过读写FILE * fp = fopen(“ ./ test / 1.txt”,“ W +”)
来打开文件
3检查程序中是否存在句柄泄漏的可能性,即频繁调用fopen而没有fclose,这种情况的出现是它可以在前一个开始时成功打开

一段时间后,打开方式失败,检查路径和权限,然后检查句柄是否泄漏没有问题. 通常,Linux支持多达1000个
手柄,如果打开得太多,它将无法打开,其他手柄将不会打开
4通过检查errno分析定位问题. errno是一个int值,不需要在errno.h中定义它.
您可以通过strerror(errno)查看错误信息,errno是调试程序的重要方法.
注意: errno是记录系统的最后一个错误代码.
例如
FILE * fp = NULL;
if((fp = fopen(“ ./ test / 1.txt”,“ r”))== NULL)
{

printf(“打开失败错误号=%d原因=%s \ n”,错误号,strerrno(错误号));
}
应该指出的是,以这种方式添加printf时存在问题,那么errno分支是记录系统的最后一个错误代码,它可能无法获得我们想要的错误代码,但会产生误导作用
最好的方法是
FILE * fp = NULL;
int errNum = 0;
if((fp = fopen(“ ./ test / 1.txt”,“ r”))== NULL)
{
errNum = errno;

printf(“打开失败errno =%d原因=%s \ n”,errNum,strerrno(errNum));
}
常见的errno错误代码如下:
#define EPERM 1 / *不允许操作* /
#define ENOENT 2 / *没有这样的文件或目录* /
#define ESRCH 3 / *没有这样的过程* /
#define EIO 5 / * I / O错误* /
#define ENXIO 6 / *没有这样的设备或地址* /
#define E2BIG 7 / *参数列表太长* /
#define ENOEXEC 8 / *执行格式错误* /
#define EBADF 9 / *错误的文件号* /
#define ECHILD 10 / *没有子进程* /
有关更多信息,请搜索,在此处进行分析,如果发现需要添加的内容,请进行跟进...
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-242093-1.html
检查