You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pwntools时遭遇[Errno 24] Too many open files错误的解决咨询

使用pwntools时遭遇[Errno 24] Too many open files错误的解决咨询

看起来你这是碰到了文件描述符泄漏的问题,咱们一步步来拆解和解决它~

先看看你代码里的几个小问题:

  • 你用with open(...) as f已经自动帮你管理了文件f的生命周期,所以最后那句手动的f.close()完全是多余的,甚至可能引发不必要的问题——with块结束时会自动关闭文件,不用你操心。
  • 你的循环范围是range(0,2**3360),这可是个天文数字的循环次数!哪怕每次循环只泄漏一个文件句柄,用不了多久就会触发「Too many open files」的错误,这根本扛不住。

接下来给你几个具体的修复方向,都是从根源上解决句柄泄漏的:

1. 用with语句管理pwntools的process对象

pwntools的process对象是支持上下文管理器的,也就是说你可以把它也放进with块里,这样Python会自动帮你清理process相关的所有文件句柄,包括stdin、stdout、stderr这些,完全不用手动去等wait_for_close()或者写while循环轮询poll()。

2. 优化文件打开的方式

你现在每次循环都打开一次output.txt,这不仅有性能损耗,还多了很多不必要的文件句柄创建/销毁操作。不如把文件打开的操作放到循环外面,整个循环过程中只保持一个文件句柄,既高效又安全。

修复后的代码示例

import os
from pwn import *
from time import sleep

# 把文件打开移到循环外,全程只用一个句柄
with open("output.txt", "a") as output_file:
    for a in range(0, 2**3360):
        # 用with管理process,自动清理所有相关资源
        with process(os.path.join(os.getcwd(), "flag"), stdout=output_file) as p:
            output_file.write(f'L:{a}\na')
            # 确保写入内容立刻刷到磁盘(可选,根据你的需求)
            output_file.flush()
            # 等待进程执行完成,with块会自动帮你处理后续清理
            p.wait()
        # 如果目标进程有并发限制,再保留sleep,否则可以直接去掉
        # sleep(0.05)

额外的小建议

  • 如果调整代码后还是碰到这个错误,可以检查下你的目标程序flag本身有没有文件句柄泄漏的问题——要是目标程序自己打开了文件没关,那也会慢慢耗尽系统的句柄资源。
  • 要是系统默认的文件句柄限制太低,也可以临时调高(比如Linux下用ulimit -n 4096),但这只是治标不治本的办法,核心还是要把代码里的资源管理做好。

备注:内容来源于stack exchange,提问作者Michael Hearn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 08:20:27