使用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
相关产品推荐
相关产品推荐

