python - 如何故意导致Errno 23 ENFILE

标签 python linux sockets centos fedora

有没有办法可以故意导致 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

(之后使用新 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 和 Fedora 20。也许在这些系统中还需要进行一些其他设置?

谢谢!

最佳答案

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

关于python - 如何故意导致Errno 23 ENFILE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32763185/

相关文章:

python - 具有 "gcloud functions deploy"的 GCP 云函数失败,--source 作为文件而不是目录

python - 如何在 Selenium Chrome Python 中设置窗口大小

linux - Linux 内核如何知道在启动时加载哪些驱动程序?

sockets - 在 Python 中创建 WebSocket 客户端

Python Flask - 如何通过 cookie/session 记住匿名用户?

python - 在 RaspberryPi 中安装 OpenCV 以与 Python 一起使用的正确方法

linux - 在 linux 上使用 J 的 C 共享库接口(interface)(dll)

c - 如何在PAM应用程序中捕获密码

Python- select() 是否可以与 UDP 函数(recvfrom() 和 sendto() )一起使用?

c++ - 如何测量套接字消息的传输时间?