在项目中使用了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的文件地址。

filename 必需。规定要打开的文件或 URL。 mode 必需。规定要求到该文件/流的访问类型。 include_path 可选。如果也需要在 include_path 中检索文件的话,可以将该参数设为 1 或 TRUE。 context 可选。规定文件句柄的环境。Context 是可以修改流的行为的一套选项。 说明: fopen () 将 filename 指定的名字资源绑 【基本概念】 1、 阻塞 阻塞 操作是指在执行设备操作时,托不能获得资源,则挂起进程直到满足操作所需的条件后再进行操作。被挂起的进程进入休眠状态(不占用cpu资源),从调度器的运行队列转移到等待队列,直到条件满足。 2、非 阻塞 阻塞 操作是指在进行设备操作是,若操作条件不满足并不会挂起,而是直接返回或重新查询(一直占用CPU资源)直到操作条件满足为止。   当用户空间的应用... windows nginx造成的file_get_contents、 fopen 、curl在访问本地php文件造成 阻塞 的问题相信很多人都遇到过,关于这个问题涉及到了php的运行等问题,有兴趣的可以先去看我上一篇博客对php运行的讲解php的运行原理、cgi对比fastcgi以及php-cgi和php-fpm之间的联系区别。这个问题有许多博客都讲解过,不过在我解决问题的过程中我发现许多博客写的要么不够 一、问题描述 fopen 函数 使用过程发现,当 fopen 要打开的文件路径中,包含一个不存在路径时,不管 fopen 函数 的第二参数设成什么,都无法建立该文件。实例:char *filename = "/usr/local/ct/mirror_im_protocol.cfg";FILE *fp = NULL; if ((fp= fopen (filename,"a"))==NULL){ printf("o... 了解 阻塞 模式和非 阻塞 模式龙行个人随笔2019-11-2817330评论其实看到这两个词' 阻塞 '和'非 阻塞 '估计就会明白一大半了.再来详细说说这两个词的区别:一:先来说说概念: 阻塞 与非 阻塞 阻塞 和非 阻塞 关注的是程序在等待调用结果(消息,返回值)时的状态. 阻塞 调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。非 阻塞 调用指在不能立刻得到结果之前... 简而言之,产生段错误就是访问了错误的内存段。一、一般来说,段错误就是指访问的内存超出了系统分配给这个程序的内存空间,通常这个值是由gdtr来保存的,1)gdtr是一个48位的寄存器,其中的32位是保 存由它指向的gdt表,后13位保存相应于gdt的下标,最后3位包括了程序是否在内存中以及程序的在cpu中的运行级别。2)指向的gdt是由以64位为一 个单位的表,在这张表中就保存着程序运行的代码段以及... fopen 出现段错误,不解[已解决](2012-04-10 04:10:26)标签:杂谈 fopen 出现段错误,不解[已解决]本来在Gentoo下编的一个C库,通过swig提供一个python接口今天把程序拷贝到openSUSE下,编译通过,运行出错,attach上gdb看了下,是 fopen 出段错误目前完全找不到北,大家指点下===============================我是分割线=... 最近 fopen 遇到打不开文件的问题,参考下面的方法3问题解决了。 原文链接:https://blog.csdn.net/Andy_93/article/details/78865000 最近在分析一个偶现的问题,偶现概率特别低,问题还在分析中。把分析的知识做个总结,后面再继续补充。 问题描述: 代码在调用Lua的require 函数 时发生异常,通过查看require的源码跟踪,发现该 函数 fopen 函数 返回打开文件失败的异常, 下面就来总结下 fopen 打开文件出错可能有哪些原因,也许不全,欢迎补充。 今天tuxedo的某个服务一调用就挂死,不报错,没coredump,经过打日志定位,有问题的代码是这一行: fprintf(m_fp,"%s%s",strTime.c_str(),strFmt.c_str()); m_fp是File*,后面两个变量都是string,并且都能打印出来,没有问题。 DaYong一口咬定就是 fopen 的问题。于是查看 fopen 的代码: m_fp =...