fopen函数失败原因分析以及分析原因的方法
来源:互联网 发布:淘宝空包是什么意思 编辑:程序博客网 时间:2024/05/16 08:10
概述:
最近在分析一个偶现的问题,偶现概率特别低,问题还在分析中。把分析的知识做个总结,后面再继续补充。问题描述:
代码在调用Lua的require函数时发生异常,通过查看require的源码跟踪,发现该函数的fopen函数返回打开文件失败的异常,下面就来总结下fopen打开文件出错可能有哪些原因,也许不全,欢迎补充。
函数介绍:
函数原型 FILE * fopen(const char * path,const char * mode);函数功能 打开一个文件
参数: path [in] 名称 mode[in] 打开方式
返回值:文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在errno 中。
注:这里只是简单介绍下函数功能和参数,具体参数意思此处不分析。
原因分析及方法
1 参数path问题, 路径不对fopen就会是返回失败。分析:首先查看path文件是否存在,其次检查path的路径相对路径还是绝对路径?如果是相对路径再检查是否当前进程的目录会切换了,软件找不到文件了.
如 相对路径 FILE *fp = fopen("./test/1.txt", "r");
绝对路径 FILE *fp = fopen("/mnt/text/1.txt", "r");
假如确定参数path没问题后,则可以排除文件不存在的路径问题。此时可以打印错误码errno来定位问题(这个后面介绍)。
2 参数mode问题,mode控制文件打开的方式,如果用户打开的方式超出了当前用户的权限,那么fopen也会返回失败,
此时应该检查当前用户的操作权限,也可以打印错误码errno来定位问题
如果当前用户仅仅只有读的权限而以读写的方式打开文件 FILE *fp = fopen("./test/1.txt", "W+")
3 检查程序中是否有句柄泄露的可能即频繁的调用fopen而没有fclose,这种情况的表象就是前面刚刚开始的时候可以open成功
过一段时间后,怎么都open不成功了,检查路径和权限都没有问题, 那此时就要检查下是否句柄泄露了。一般linux最多支持1000来个
句柄,打开太多不关,则其他的没法打开了
4 通过检查errno来分析定位问题, errno是一个int型的值,在errno.h中定义不需要自己定义。
可以通过strerror(errno)查看错误信息, errno是调试程序的一个重要方法。
注:errno 是记录系统的最后一次错误代码。
例如
FILE *fp = NULL;
if ((fp =fopen("./test/1.txt", "r")) == NULL)
{
printf("open fail errno = %d reason = %s \n", errno, strerrno(errno));
}
需要指出的是这样加入printf出问题,那么分局errno是记录系统最后一次错误代码,则有可能得不到我们想要的错误码,反而误导
最好的办法就是
FILE *fp = NULL;
int errNum = 0;
if ((fp =fopen("./test/1.txt", "r")) == NULL)
{
errNum = errno;
printf("open fail errno = %d reason = %s \n", errNum, strerrno(errNum));
}
常见的errno错误码有以下这些:
#define EPERM 1 /* Operation not permitted */
#define ENOENT 2 /* No such file or directory */
#define ESRCH 3 /* No such process */
#define EIO 5 /* I/O error */
#define ENXIO 6 /* No such device or address */
#define E2BIG 7 /* Argument list too long */
#define ENOEXEC 8 /* Exec format error */
#define EBADF 9 /* Bad file number */
#define ECHILD 10 /* No child processes */
更多的请网上搜索, 这里就分析这些,后续有发现继续补充...
- fopen函数失败原因分析以及分析原因的方法
- DoModal()函数调用失败的原因分析:
- 一个fopen失败的原因
- mmap函数及其映射失败原因分析
- 项目失败原因分析
- 占座网失败原因分析
- 装机失败原因分析
- 关于对话框DoModal()函数调用失败的原因分析
- 关于对话框DoModal()函数调用失败的原因分析
- fopen自动创建文件失败的原因
- writeUTF输出字符串失败的原因分析
- dll调用失败的原因分析
- Wince启动失败的原因分析
- Eraser unused space 失败的原因分析!
- 加载动态库失败的原因分析
- 系统调用system失败的原因分析
- Android自动运行失败的原因分析
- mysql_install_db 运行失败的一些原因分析
- 43、任务调用
- TestNG Priority in Test Cases
- 第三方开源库 RxJava
- 城市三级联动php
- selenium java的三种时间等待
- fopen函数失败原因分析以及分析原因的方法
- rundeck调度工具的使用
- 垃圾回收器CMS的配置
- android gradle 下载
- 第三方开源库 RxJava
- Cause: java.sql.SQLException: ORA-01795: 列表中的最大表达式数为 1000
- HDU 2614.Beat
- 开发中常用命令
- Java遇到的相关问题