Signalhandling in C_API

15/06/2010 - 19:05 von Ole Streicher | Report spam
Hallo,

ich habe (wie hier schon mehrfach erwàhnt :-) ) eine Bibliothek per
C-API angebunden. Das Problem, das ich jetzt damit habe ist, dass ich
einen Funktionsaufruf dieser API nicht per Ctrl-C (SIGINT) unterbrechbar
ist.

Was müsste ich tun, damit Ctrl-C auch dort funktioniert? "Einfach" vor
dem C-Aufruf einen passenden Signalhandler (re-)installieren, das den
Dreck wegràumt? Würde (I)Python verwirrt, wenn es im interaktiven Modus
den Signalhandler verbogen bekommt?

Viele Grüße

Ole
 

Lesen sie die antworten

#1 Thomas Rachel
16/06/2010 - 09:02 | Warnen spam
Am 15.06.2010 19:05, schrieb Ole Streicher:
Hallo,

ich habe (wie hier schon mehrfach erwàhnt :-) ) eine Bibliothek per
C-API angebunden. Das Problem, das ich jetzt damit habe ist, dass ich
einen Funktionsaufruf dieser API nicht per Ctrl-C (SIGINT) unterbrechbar
ist.

Was müsste ich tun, damit Ctrl-C auch dort funktioniert? "Einfach" vor
dem C-Aufruf einen passenden Signalhandler (re-)installieren, das den
Dreck wegràumt? Würde (I)Python verwirrt, wenn es im interaktiven Modus
den Signalhandler verbogen bekommt?



Ich habe teilweise dasselbe Problem (hioer aber nicht so gravierend) bei
Datenbankabfragen etc. Ich hab eben mal ein wenig damit herumgespielt
und festgestellt, daß es jedenfalls nichts bringt, einen anderen
Signalhandler zu setzen, weil der erst aufgerufen wird, wenn die
C-Funktion zurückkehrt. (Hat möglicherweise (!) damit zu tun, daß
wàhrend des Aufrufs von C-Funktionen der GIL losgelassen wird und erst
danach wieder gehalten wird. Dann darf der selbstgesetzte Handler nichts
tun.)

Wie das intern funktioniert wird, müßte man sich anhand des Quellcodes
anschauen, ich vermute aber, daß Python im Fall eines selbstgesetzten
Handlers einen internen Handler setzt, der das Signal auffàngt und es
sich merkt, bis der Python-Handler aufgerufen werden kann. Das wàre
spàtestens nach Rückkehr der C-Funktion - oder wenn
<http://docs.python.org/c-api/except...ignals>
aufgerufen wurde. Das müßte die C-Funktion bewerkstelligen und dann
zurückkehren - wenn das irgendwie geht. Wenn Du nur eine externe Library
aufrufst, wird das wohl eher nicht gehen...


Thomas

Ähnliche fragen