日期:2014-05-16  浏览次数:20652 次

偶尔打开文件失败
不知道大家有没有遇到这个问题:平时读写文件的时候都没问题,上周末测试的时候突然发现打开文件失败,我就尝试打开别的文件,结果也是打开失败,重启后正常.
我是用fopen做的,如:
                 FILE   *file;   
                 file   =   fopen("map1",   "r+");
发现打开文件失败后,尝试打开别的文件,
                 file   =   fopen("map2",   "r+");
                 file   =   fopen("map3",   "r+");
                 file   =   fopen("map4",   "r+");
都同样失败,这个问题不是经常出现.退出程序重新进去后正常.

这段代码是去年写的,调试一年多以来,就出现过一次打开文件失败,那时没注意,上周末在评审时候第二次出现这个问题,有什么办法解决这个问题呢?希望各大虾能帮忙一下

------解决方案--------------------
你把errno打出来,至少要知道为什么fopen出错
------解决方案--------------------
是不是在程序中偶尔更改了工作目录或其他目录,导致找不到 map1/2/3...

------解决方案--------------------
是文件状态没有清空吧?估计之前有文件打开未close
------解决方案--------------------
很可能是有其他程序打开了这个文件,或者是这个文件被多次打开后句柄没关闭
------解决方案--------------------
林哥果然用功啊,佩服佩服。
------解决方案--------------------
引用:
这个我想是不可能的,所读出的几个文件一直都在那个目录下的,从来就没有动过,而且调试过数十次都没有出现过问题,只有一次在同一个程序里出现打开文件失败的时候去打开我所做的那一部分,同样出现文件不能打开的现象,重新进程序又正常了
引用:
 是不是在程序中偶尔更改了工作目录或其他目录,导致找不到 map1/2/3...

不是说这几个文件换了目录,而是你的某个不经常的操作可能改变了程序的当前目录
------解决方案--------------------
我想,这可能是发生异常了吧。
看errno 是个好办法。
估计系统出了啥问题。
------解决方案--------------------
引用:
fopen的句柄数有限,我如何知道当前进程打开状态下的句柄总数?


查询 /proc/self/fd/或/proc/self/fdinfo/目录下有多少文件描述符就可以知道当前进程打开的文件总数
------解决方案--------------------
楼上的应该可以
------解决方案--------------------
sys/resource.h 中定义的RLIMIT_NOFILE是可以打开的文件数
------解决方案--------------------
为什么不在写代码的时候,就直接判断文件打开是否成功,并且失败的时候直接打出来errno呢?这个时候,产品

都release出去了,遇到问题才想起errno的重要性来...

我前几天遇到一个和你几乎一摸一样的问题,代码是别人写的,我调了半个小时,总是在bind()的时候失败,后

来跟进去,发现就判断个返回值,我自己又加了句errno,一下就看出问题了