有没有办法故意导致errno 23(ENFILE文件表溢出)?

我正在做套接字编程,我想检查是否创建过多的套接字会导致此错误。据我了解-创建的 socks 被视为文件描述符,因此它应计入已打开文件的系统限制。

这是我的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

(之后使用新 session 登录)

2)系统范围的限制
通过更改/etc/sysctl.conf
fs.file-max = 5000
and then run sysctl -p to apply the changes.

尽管不受每个用户和整个系统的限制,我的脚本仍可以轻松创建10k套接字,并且以errno 24(EMFILE)结尾。

是否有可能实现我的目标?我使用的是两个操作系统-CentOS 6.7和Fedora20。也许在这些系统中需要进行其他设置?

谢谢!

最佳答案

ENFILE仅在达到系统范围的限制时才会发生,而到目前为止,您尝试过的设置是每个进程的,因此仅与EMFILE.有关。有关更多详细信息,包括更改哪些系统范围设置以触发ENFILE,请参见此答案。 :https://stackoverflow.com/a/24862823/4323https://serverfault.com/questions/122679/how-do-ulimit-n-and-proc-sys-fs-file-max-differ

07-28 07:26