2010-12-29 14 views

Antwort

6

Nein, du kannst nicht. Überprüfen Sie die Manpage signal(7) für eine Liste von async-signal-sicheren Funktionen. fprintf ist nicht in dieser Liste enthalten.

Wenn Sie keine Formatierung benötigen, können Sie write(STDERR_FILENO, <buf>, <buflen>) verwenden, um in stderr zu schreiben.

+0

ist es eine liste von funktionen aus libc oder liste von kernel syscalls? – osgx

+0

http://linux.die.net/man/7/signal gibt es keine Liste. Kannst du mir einen Link geben? – osgx

+1

@osgx: Link zur Antwort hinzugefügt. Es ist eine Liste von Posix-Funktionen, die auch den libc-Standard enthält. Der libc-Standard erfordert jedoch keine libc-Funktion (außer signal()), um wiedereintrittsfähig zu sein. Daher können Sie (portabel) keine libc-Funktion innerhalb eines Signal-Handlers verwenden. – Fabian

4

Dies ist nicht sicher, zitierte IBM developer Artikel über Signal Handling Safety

die Signal-Handler eine Nachricht mit fprintf druckt Angenommen, und das Programm war in der Mitte eines Anrufs fprintf den gleichen Strom zu verwenden, wenn das Signal geliefert wurde . Sowohl die Nachricht des Signal-Handlers als auch die Daten des Programms könnten beschädigt sein, da beide Aufrufe auf derselben Datenstruktur laufen: dem Datenstrom selbst.

+0

glibc hat eine IO-Sperre in einer Datei *. Also, fprintf, das einen ersten fprintf unterbricht, wartet – osgx

+4

@osgx: Signalhandler sind keine Threads. Innerhalb eines Signal-Handlers zu warten, ist eine sehr schlechte Nachricht, da der Thread, der die Sperre hält, erst dann Fortschritte machen kann, wenn der Signal-Handler beendet ist. Sie haben also eine Sackgasse. –

+0

@Ben Voigt, ich sage wirklich "Thread"? – osgx

Verwandte Themen