Das Python-Subprozessmodul gibt bei segfault kein stdout zurück

8

Ich laufe eine C-ausführbare Datei von Python und diese ausführbare Datei manchmal segfaults. Wenn es segfaults gibt das Subprozessmodul nichts in stdout oder stderr zurück.

Beispielcode:

%Vor%

Die Quelle für a.out ist:

%Vor%

Die Ausgabe von ./a.out ist:

%Vor%

Die Ausgabe des Python-Codes ist (in Linux, Python 2.7):

%Vor%

Gibt es eine Möglichkeit, die Ausgabe der ausführbaren Datei zu erhalten, selbst wenn sie abstürzt?

Eine generische Methode, um Returncode in eine String-Nachricht zu übersetzen, wäre auch nett.

    
user1392871 14.05.2012, 02:57
quelle

2 Antworten

3

Ihr C-Programm spült nicht seinen Ausgabepuffer. Der einfachste Weg, dieses Problem zu umgehen, ist, den Ausgabemodus von STDOUT auf ungepuffert zu ändern:

%Vor%

Jetzt erzeugt Ihr Programm (das ich bearbeitet habe, um einen Tippfehler zu korrigieren) die richtige Ausgabe:

%Vor%

Der Rückkehrcode ist auf meinem Mac 0, was verwirrend ist, da Programme, die für ein Signal beendet werden, keinen Rückkehrcode haben.

    
vy32 14.05.2012 03:14
quelle
2

Die Anwendung wird ihre Ausgabepuffer fast sicher nicht löschen, bevor sie den Segmentierungsfehler feststellt.

Standardmäßig konfiguriert die C stdio-Bibliothek die Pufferung für stdout so, dass die Puffer an jedem Ende der Zeile gelöscht werden, aber nur stdout ist ein tty. Deshalb sehen Sie tun die Ausgabe, wenn Sie a.out von der Befehlszeile ausführen.

Sie können das C-Programm nicht direkt von der Python-Seite aus ändern. Aber was Sie können tun, ist es ein Tty für seine stdout , nämlich eine Pseudo-Tty zu verwenden. Die Details zum Öffnen und Einrichten eines Pseudo-Terminals sind viel komplizierter als das Einrichten einer regulären Pipe, aber es gibt einige Module, die Ihnen helfen werden: Siehe Pexpect und diese SO Frage , unter anderem.

    
Celada 14.05.2012 03:06
quelle