Ich habe Popen Bash eingefädelt, um Kommandozeilen-Tools zu laufen. bash erzeugt einen segfault oder bricht den ausführenden Befehl ab.Thread Popen Absturz auf Segmentierung Fehler in 'Bash'
Die Funktion FunctionToThread wird mit dem Threading-Modul gefädelt. Wie oben erwähnt, endet der Thread, wenn in bash ein segfault auftritt.
Ich möchte entweder diese segfault in einem try/except-Steuerelement erfassen und am wichtigsten verhindern, dass mein Thread beendet wird.
Wie erreiche ich das?
"""SNIPPET"""
from multiprocessing import cpu_count
import threading
from subprocess import Popen, PIPE
import os
start =0
numcores = cpu_count()
global RESULTS, LOCK
LOCK = threading.Lock()
RESULTS = []
def ParallelRun(commands, RESULTS, LOCK):
for i in range(0, 100):
LOCK.acquire()
RESULTS.append('ParallelRUn')
LOCK.release()
su2 = Popen('bash', shell = True, stdin = PIPE, stdout=PIPE, env = os.environ)
for i in commands:
su2.stdin.write(i)
su2.stdin.close()
err =su2.wait()
for i in range(0, numcores):
commands = ['Enter commands which cause Segmentation Faults']
t = threading.Thread(target=ParallelRun, args=(commands, RESULTS, LOCK))
threads.append(t)
for t in threads:
t.start()
for t in threads:
t.join()
print len(RESULTS), RESULTS
Zu meinem Problem, in den Befehle Liste Befehle eingeben replizieren, die segfaults erzeugen.
Danke !!
Können Sie ein kleines reproduzierbares Snippet erstellen, das ich per Kopieren + Einfügen ausführen kann? – guettli
@guettli: Ich habe ein Snippet hinzugefügt. In der Befehlsliste kann eine Reihe von Befehlen hinzugefügt werden, die Segmentierungsfehler erzeugen. – pds
pds Sie hatten eine Variable 'fp' im letzten Ausschnitt, der als' stdout' verwendet wurde und jetzt verwenden Sie 'PIPE'. Was hat diese Änderung ausgelöst? – tijko