【发布时间】:2015-09-24 13:53:01
【问题描述】:
有没有办法可以故意导致 errno 23(ENFILE 文件表溢出)?
我正在做套接字编程,我想检查创建太多套接字是否会导致此错误。据我了解 - 创建的 socked 被视为文件描述符,因此它应该计入打开文件的系统限制。
这是我的 python 脚本的一部分,它创建了套接字
def enfile():
nofile_soft_limit = 10000
nofile_hard_limit = 20000
resource.setrlimit(resource.RLIMIT_NOFILE, (nofile_soft_limit,nofile_hard_limit))
sock_table = []
for i in range(0, 10000):
print "Creating socket number {0}".format(i)
try:
temp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.SOL_UDP)
except socket.error as msg:
print 'Failed to create socket. Error code: ' + str(msg[0]) + ' , Error message : ' + msg[1]
print msg[0]
sock_table.append(temp)
使用 setrlimit() 我将打开文件的进程限制更改为较高的值,这样我就不会得到 Errno24 (EMFILE)。
我尝试了两种方法: 1) 每用户限制 通过更改 /etc/security/limits.conf
root hard nofile 5000
root soft nofile 5000
(之后使用新会话登录)
2) 系统范围的限制 通过更改 /etc/sysctl.conf
fs.file-max = 5000
and then run sysctl -p to apply the changes.
尽管每个用户和系统范围有限制,但我的脚本很容易创建 10k 个套接字,并且它以 errno 24 (EMFILE) 结束。
是否有可能实现我的目标?我正在使用两个操作系统 - CentOS 6.7 和 Fedora 20。也许在这些系统中需要进行一些其他设置?
谢谢!
【问题讨论】:
标签: python linux sockets centos fedora