c – fopen问题 – 打开的文件太多了
发布时间:2020-12-16 09:28:36 所属栏目:百科 来源:网络整理
导读:我有一个在Win XP上运行的多线程应用程序.在某个阶段,其中一个线程无法使用fopen函数打开现有文件. _get_errno函数返回EMFILE,这意味着打开的文件太多.没有更多的文件描述符可用.我的平台的FOPEN_MAX是20._getmaxstdio返回512.我用WinDbg检查了这个,我看到大
我有一个在Win XP上运行的多线程应用程序.在某个阶段,其中一个线程无法使用fopen函数打开现有文件. _get_errno函数返回EMFILE,这意味着打开的文件太多.没有更多的文件描述符可用.我的平台的FOPEN_MAX是20._getmaxstdio返回512.我用WinDbg检查了这个,我看到大约有100个文件是打开的:
788 Handles Type Count Event 201 Section 12 File 101 Port 3 Directory 3 Mutant 32 WindowStation 2 Semaphore 351 Key 12 Thread 63 Desktop 1 IoCompletion 6 KeyedEvent 1 fopen失败的原因是什么? 编辑: 我写了简单的单线程测试应用程序.这个程序可以打开510文件.我不明白为什么这个应用程序可以打开更多文件,然后多线程应用程序.可能是因为文件句柄泄漏了吗? #include <cstdio> #include <cassert> #include <cerrno> void main() { int counter(0); while (true) { char buffer[256] = {0}; sprintf(buffer,"C:tempabcabc%d.txt",counter++); FILE* hFile = fopen(buffer,"wb+"); if (0 == hFile) { // check error code int err(0); errno_t ret = _get_errno(&err); assert(0 == ret); int maxAllowed = _getmaxstdio(); assert(hFile); } } } 解决方法
我认为在win32中所有的crt函数最终将使用下面的win32 api结束.所以在这种情况下,最有可能的是它必须使用win32的CreateFile / OpenFile.现在,CreatFile / OpenFile api不仅适用于文件(文件,目录,通信端口,管道,邮件槽,驱动器卷等).因此,在实际应用中,根据这些资源的数量,您的最大打开文件可能会有所不同.由于您没有详细介绍该应用程序.这是我的第一个猜测.如果时间允许,请通过此
http://blogs.technet.com/b/markrussinovich/archive/2009/09/29/3283844.aspx
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |