Kann ich fprintf(stderr)
in einem Signal (SIGALRM) Handler mit glibc/linux verwenden?linux/glibc. Kann ich fprintf im Signalhandler verwenden?
Antwort
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.
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.
glibc hat eine IO-Sperre in einer Datei *. Also, fprintf, das einen ersten fprintf unterbricht, wartet – osgx
@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. –
@Ben Voigt, ich sage wirklich "Thread"? – osgx
ist es eine liste von funktionen aus libc oder liste von kernel syscalls? – osgx
http://linux.die.net/man/7/signal gibt es keine Liste. Kannst du mir einen Link geben? – osgx
@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