系统进程打开文件最大句柄数的限制

来源:互联网 发布:淘宝上怎么卖二手货 编辑:程序博客网 时间:2024/05/02 03:09

转自:http://blog.csdn.net/iihero/article/details/8103815

Windows下,默认值是512。但是可以改:

/**
*  get and set the max handlers of opening files
*/

void testMaxHandlersOfFiles()
{
    printf( "maxstdio: %d\n", _getmaxstdio());
    _setmaxstdio(2048);
    printf( "maxstdio: %d\n", _getmaxstdio());
}

Linux下,可用ulimit命令来查看和修改,或者修改/etc/security/limits.conf也可以修改。

这个东东作用非常大。有时候直接影响到一个服务器程序的性能,可用性。

笔者曾经遇到某应用服务器进程同时打开太多文件,导致系统不可用的问题。如果事先知道这些限制,那么就可以少走弯路了。

 

转自:http://blog.sina.com.cn/s/blog_4b7b0e6c0100sqv4.html

刚才帮同学看了个程序,结构比较简单,一个计算函数,一个主函数。

编译无错,运行时,总是运行到第509次时就崩溃了。

简单看了下程序,主函数就是一个调用计算函数的循环,计算函数里面有若干次的文件读写操作和一次随机数生成调用,其他是大量的计算过程。

先扫了下代码,发现太乱,就先想看是不是随机数调用的问题,于是把随机数生成去掉运行,结果还是第509次运行出错,看来不是随机数的问题;接着把计算过程都注释掉运行,依然是第509次崩溃;最后目光集中到剩下的文件操作上,联想到509跟255的关系,猜测可能是文件句柄打开的数目达到了系统上限,虽然我自己从来没碰到过这种情况。

接着重点检查文件打开和关闭,果然,所有的文件打开关闭操作都有对应,唯独有一次没有关闭。于是加上一条关闭语句,再运行,果然正常了,不再崩溃。

问题解决了,但为什么是509次呢?跟2的n次方没什么关系啊?想了下,可能是程序启动时系统默认打开了三个句柄的缘故,即标准输入文件stdin、标准输出文件stdout、标准错误输出文件stderr

为了验证,搜索了一下,发现有一对可以获取和设置当前系统允许打开的最大句柄数的函数:_getmaxstdio()_setmaxstdio()。不过这是windows的平台函数,其他系统平台有没有类似的函数没去深究。

写了个程序简单验证了一下,果然,当前系统允许的最大句柄数是512,512-3=509。

问题虽然不是很复杂,但进一步说明,一定要有良好的文件操作习惯。程序简单了还好,复杂了就难说了。

 

原创粉丝点击