2016-04-03 4 views
0

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 !!

+0

Können Sie ein kleines reproduzierbares Snippet erstellen, das ich per Kopieren + Einfügen ausführen kann? – guettli

+0

@guettli: Ich habe ein Snippet hinzugefügt. In der Befehlsliste kann eine Reihe von Befehlen hinzugefügt werden, die Segmentierungsfehler erzeugen. – pds

+0

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

Antwort

1

Dieses Problem wurde behoben. Es stellt sich heraus, dass ich eine Rückkehr Anweisung in if/else Blöcke des Programms hatte, das meinen Thread beendete.