2011-04-19 2 views
8

J'écris un programme en Python qui utilise une API à code source fermé sous Linux. L'API fonctionne parfois, et parfois segfaults - écrasant mon programme aussi. Cependant, si le programme s'exécute pendant 10 secondes, il est passé le point où il a une chance de segfaulting et s'exécute pour toujours (les erreurs se produisent seulement au début).Manipulation gracieuse de Segfault

Je pense que je besoin d'un certain type de script:

commence mon programme python,

attend 10 secondes,

vérifie si python est toujours en cours d'exécution

si elle est en cours d'exécution, le script doit se terminer sans terminer python

si python n'est PAS exécuté g, puis répétez.

Un tel programme est-il possible? Est-ce qu'un segfault va tuer le script aussi?

Répondre

2

Oui, un tel programme est parfaitement possible. Vous avez juste à exécuter ces deux programmes dans des processus séparés - SEGFAULT ne tue que le processus dans lequel il s'est produit.

Si vous êtes sous Linux, vous pouvez utiliser bash ou python si vous le souhaitez. Il suffit de lancer le script qui est en cours dans un processus séparé. Code en python pourrait ressembler à ceci:

import subprocess 
import time 

start = time.clock() 
ret = subprocess.call(['myprog', 'myarg0', ...]) 
end = time.clock() 
if end - start > threshold: 
    restart() 

Aussi, peut-être un code de retour de ce processus a une valeur significative quand il a fini à cause de SEGFAULT.

1

Pouvez-vous isoler les appels à cette API buggy à l'intérieur d'un child process? De cette façon, vous pouvez vérifier le statut de sortie et gérer les plantages dans un Try ... Catch