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
- 1. Wie kann ich fprintf verwenden und in eine Pipe schreiben?
- 2. Fangsignale: Verwenden Sie eine Elementfunktion als Signalhandler
- 3. aio_read innerhalb Signalhandler
- 4. Wann sollte ich perror ("...") und fprintf (stderr, "...") verwenden?
- 5. Probleme fprintf
- 6. fprintf mit String-Argument
- 7. Wie kann fprintf in Linux blockieren?
- 8. Wie drucke ich \\ in C? (fprintf)
- 9. C fprintf mit Farben
- 10. Kann ich dies im Repository-Modell verwenden?
- 11. Kann ich Platzhalter im Pfadattribut web.config verwenden?
- 12. Kann ich System.Runtime.Caching.MemoryCache im Cloud-Webrollenprojekt verwenden?
- 13. Kann ich DisplayTemplates im Controller verwenden
- 14. fprintf schreibt nicht in Datei
- 15. Wie kann ich Console.Write im Objektinitialisierer verwenden? Ich
- 16. Kompilierungsfehler: Fprintf wirft Parse Fehler
- 17. Einliner für fopen, fprintf, fclose?
- 18. Unix Pthreads und Signale: pro Thread Signalhandler
- 19. fprintf verursacht Kommas in Matlab
- 20. C: Kann fprintf nicht zum Ausdrucken in Ausgabedatei
- 21. lesen fprintf, während das Programm läuft
- 22. Matlab ShortEng Zahlenformat über sprintf() und fprintf()?
- 23. Übergeben von Argumenten an den Signalhandler in C
- 24. Sind fscanf und fprintf in C gepuffert?
- 25. Wie kann ich Shared Memory im Nodejs-Programm verwenden?
- 26. Kann ich PowerShell im Shell-Modus für Emacs verwenden?
- 27. Wie kann ich das Dezimalfeld im Geodjango verwenden?
- 28. Kann ich Enum.TryParse im Markup einer ASP.Net-Seite verwenden
- 29. Wie kann ich die Silbentrennung im Google Chrome-Browser verwenden?
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