簡體   English   中英

子進程的Popen打開文件過多錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM