[英]Too many open files error with Popen of subprocess
我正在使用Python的子進程模塊來調用命令,以將值從文件寫入內存。 看起來像:
import subprocess
f = open('memdump', 'r')
content = [line.split()[1] for line in f]
f.close()
tbl_pt0 = 0x4400
tbl_pt1 = 0x4800
process = 0
i = 0
for value in content:
p1 = subprocess.Popen("echo \"jaguar instance=0; jaguar wr offset=0x%x value=%s\" | pdt" \
% (tbl_pt0, value), shell = True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True)
p2 = subprocess.Popen("echo \"jaguar instance=0; jaguar wr offset=0x%x value=%s\" | pdt" \
% (tbl_pt1, value), shell = True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True)
tbl_pt0 += 0x4
tbl_pt1 += 0x4
這里的pdt是一個寫入值的程序。 該文件中有256個值,因此for循環運行256個循環。 但是當我進入253循環時,subprocess.py中出現太多打開文件錯誤。 有人知道嗎? 謝謝。
原因是subprocess.Popen
調用是異步的,因為它立即返回,而無需等待生成的進程退出。 也就是說,您正在快速創建2x256進程。 它們每個都有2個管道,每個管道占用1個文件描述符。 單個進程一次可以打開有限數量的文件描述符,之所以要訪問它是因為您不必等待進程和管道關閉。 你可以等待他們退出,如p.communicate()
其中, p
是的返回值subprocess.Popen
,或增加在描述一次打開的最大文件:
fs.file-max = 100000
添加到/etc/sysctl.conf
sysctl -w fs.file-max=100000
對於每個Popen,您都會創建6個新的文件句柄。 也許您可以一個一個地運行進程,並使用echo的instread進行通信:
import subprocess
from itertools import count
JAGUAR = "jaguar instance=0; jaguar wr offset=0x%x value=%s"
with open('memdump', 'r') as f:
content = [line.split()[1] for line in f]
for tbl_pt0, tpl_pt1, value in zip(count(0x4400,4), count(0x4800,4), content):
subprocess.Popen(["pdt"], stdout=subprocess.PIPE, stderr=subprocess.PIPE,
close_fds=True).communicate(JAGUAR % (tbl_pt0, value))
subprocess.Popen(["pdt"], stdout=subprocess.PIPE, stderr=subprocess.PIPE,
close_fds=True).communicate(JAGUAR % (tbl_pt1, value))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.