Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正在调试fopen和fclose,打开的文件太多_C_Fopen_Fclose - Fatal编程技术网

正在调试fopen和fclose,打开的文件太多

正在调试fopen和fclose,打开的文件太多,c,fopen,fclose,C,Fopen,Fclose,我使用的是Windows7,使用的是gcc版本4.8.1。我有一个大型的多线程C程序,它对fopen和fclose进行大量调用。如果它运行的时间足够长,它将无法打开文件。我使用进行了调试,发现打开的文件太多错误,尽管一次打开的文件不应该超过几个。我已经查看了很多次代码,但都找不到bug(对于fopen的每个调用,都有一个对应的fclose调用被执行,并且没有函数使用多个文件*变量)。有进一步的调试建议吗?特别是有没有返回当前打开的文件数的函数 这是一个“经典”的资源泄漏问题。很可能存在一个代码路

我使用的是Windows7,使用的是
gcc版本4.8.1
。我有一个大型的多线程C程序,它对
fopen
fclose
进行大量调用。如果它运行的时间足够长,它将无法打开文件。我使用
进行了调试,发现
打开的文件太多
错误,尽管一次打开的文件不应该超过几个。我已经查看了很多次代码,但都找不到bug(对于
fopen
的每个调用,都有一个对应的
fclose
调用被执行,并且没有函数使用多个
文件*
变量)。有进一步的调试建议吗?特别是有没有返回当前打开的文件数的函数

这是一个“经典”的资源泄漏问题。很可能存在一个代码路径,在该路径中文件被打开但未关闭。错误处理代码路径是常见的可疑问题之一。您可以在web上搜索“debug resource leaks c”或类似内容


查找用于跟踪内存资源泄漏的工具的信息会更容易(我刚刚在谷歌上搜索过)。您可以使用内存资源泄漏工具来解决此问题,方法是每次打开文件时分配一小块内存,然后在关闭文件时释放内存。如果内存泄漏工具是一个相当好的工具,If将为任何泄漏内存提供堆栈跟踪或源文件/行号。该位置将位于打开的文件旁边。

每次打开和关闭文件时,使用文件名或其他标识信息调用
fprintf()
stderr
,这是一种明显的启动策略,因此您可以看到哪些文件正在打开,而哪些文件没有关闭。可能是,线程关闭文件的速度不够快,或者线程太多。如果它在Linux上,您可以使用
/proc/sys/fs/file nr
查找打开的fds。发布相关信息,如总线程数、在创建更多线程之前是否关闭文件等将有所帮助。或者可能是一个错误。错误在于您一次使用的文件太多。也许重新思考不会出错只有4个线程,并且一次只能打开几个文件。所有对fopen的调用都是在“r”模式下使用的,所以我假设没有线程安全问题。这是正确的吗?