在项目中使用了fopen函数阻塞现象,而且阻塞的时间很长(大概二十分钟)
函数原型:FILE * fopen(const char * path, const char * mode);
fopen出现问题分析:
1 、参数path问题, 路径不对fopen就会是返回失败。
2、 参数mode问题,mode控制文件打开的方式,如果用户打开的方式超出了当前用户的权限,那么fopen也会返回失败,此时应该检查当前用户的操作权限。
3 、检查程序中是否有句柄泄露的可能即频繁的调用fopen而没有fclose,这种情况的表象就是前面刚刚开始的时候可以open成功,过一段时间后,怎么都open不成功了,检查路径和权限都没有问题,那此时就要检查下是否句柄泄露了。一般linux最多支持1000来个句柄,打开太多不关,则其他的没法打开了
4 、通过检查errno来分析定位问题, errno是一个int型的值,在errno.h中定义不需要自己定义。可以通过strerror(errno)查看错误信息, errno是调试程序的一个重要方法。
从分析可以看出长时间的阻塞并不是fopen产生的,在项目中出现的阻塞的原因是在使用fopen之前对系统执行了ifconfig命令修改了设备的IP地址,nfs文件系统出现了问题,mount的地址也就不存在,使得fopen无法发现nfs的文件地址。