Ich habe seit einiger Zeit gesucht und habe noch keine definitive Antwort gefunden. Die einzige Verbindung, die ich bis jetzt gefunden habe, die etwas Licht auf dieses wirft, ist here.Sind gnu syslog(), openlog() und closelog() threadsicher?
Antwort
Gemäß der POSIX Specification syslog(), openlog() und closelog() Thread sicher.
Es gibt noch einen Thread, der diese Frage ebenfalls beantwortet und bereits 2009 datiert ist. Hier ist der Link syslog_r for Linux?.
(Während ich auf diesem Experiment arbeite, @ user3088572 die Frage beantwortet. Da ich diese halbwegs komplett hatte, ich werde es trotzdem posten.)
Die Antwort ist „Ja“, aber das war rein experimentell bestimmt.
Quelle
Hauptprozess laicht drei Fäden und wartet, während alle Fäden unterschiedlichen Saiten gleichzeitig drucken. Dann, nach 1 Sekunde, sagt es allen, dass sie anhalten und aussteigen sollen.
#include <pthread.h>
#include <syslog.h>
static int go = 1;
void * routine(void * str)
{
int c = 0;
while(go)
syslog(7, "%d: %s", c++, (char *)str);
}
int main(int argc, char * argv[])
{
pthread_t t1, t2, t3;
char str1[100] = "111111111111111111111111111111111111111111111111111111111\n";
char str2[100] = "222222222222222222222222222222222222222222222222222222222\n";
char str3[100] = "333333333333333333333333333333333333333333333333333333333\n";
openlog("syslog-test", LOG_PID, LOG_USER);
pthread_create(&t1, NULL, &routine, str1);
pthread_create(&t2, NULL, &routine, str2);
pthread_create(&t3, NULL, &routine, str3);
sleep(1);
go = 0; // threads should stop now
// wait for threads to exit
pthread_join(t1, NULL);
pthread_join(t2, NULL);
pthread_join(t3, NULL);
closelog();
return (0);
}
Zu allererst Ergebnisse gab es keine Kern- oder Zugriffsfehler Dumps. Das ist gut.
Auch wenn wir die Systemprotokolle beobachten (siehe unten), können wir sehen, dass keine der Nachrichten gemischte Zeichen haben. Jede Zeile ist entweder 1
's, 2
' s oder 3
's.
$ tail /var/log/syslog
Dec 18 16:44:18 mach99 syslog-test[23347]: 68: 222222222222222222222222222222222222222222222222222222222
Dec 18 16:44:18 mach99 syslog-test[23347]: 69: 222222222222222222222222222222222222222222222222222222222
Dec 18 16:44:18 mach99 syslog-test[23347]: 70: 222222222222222222222222222222222222222222222222222222222
Dec 18 16:44:18 mach99 syslog-test[23347]: 51: 333333333333333333333333333333333333333333333333333333333
Dec 18 16:44:18 mach99 syslog-test[23347]: 49: 111111111111111111111111111111111111111111111111111111111
Dec 18 16:44:18 mach99 syslog-test[23347]: 71: 222222222222222222222222222222222222222222222222222222222
Dec 18 16:44:18 mach99 syslog-test[23347]: 52: 333333333333333333333333333333333333333333333333333333333
Dec 18 16:44:18 mach99 syslog-test[23347]: 53: 333333333333333333333333333333333333333333333333333333333
Dec 18 16:44:18 mach99 syslog-test[23347]: 50: 111111111111111111111111111111111111111111111111111111111
Dec 18 16:44:18 mach99 syslog-test[23347]: 72: 222222222222222222222222222222222222222222222222222222222
Dec 18 16:44:18 mach99 syslog-test[23347]: 54: 333333333333333333333333333333333333333333333333333333333
Dec 18 16:44:18 mach99 syslog-test[23347]: 51: 111111111111111111111111111111111111111111111111111111111
Dec 18 16:44:18 mach99 syslog-test[23347]: 73: 222222222222222222222222222222222222222222222222222222222
Dec 18 16:44:18 mach99 syslog-test[23347]: 52: 111111111111111111111111111111111111111111111111111111111
Dec 18 16:44:18 mach99 syslog-test[23347]: 53: 111111111111111111111111111111111111111111111111111111111
Dec 18 16:44:18 mach99 syslog-test[23347]: 74: 222222222222222222222222222222222222222222222222222222222
Dec 18 16:44:18 mach99 syslog-test[23347]: 55: 333333333333333333333333333333333333333333333333333333333
Dec 18 16:44:18 mach99 syslog-test[23347]: 54: 111111111111111111111111111111111111111111111111111111111
Die GNU Libc documentation for syslog
beschreibt die Verfahren, wie sie derzeit "MT-safe", die für "thread-safe" POSIX-sprechen ist.
Die Methoden werden als "AS-Unsafe" (dh unsichere für Verwendung von einem asynchronen Signalhandler) beschrieben.
Das Dokument stellt auch fest (Stand April 2015), dass diese Spezifikationen "vorläufig" sind und nicht für alle zukünftigen Versionen garantiert sind. (Ich denke, dieser Haftungsausschluss gilt für die allgemeine Idee der Kategorisierung von "Sicherheits" -Eigenschaften der glibc-API-Funktionen, und dies ist immer noch ein wenig in Arbeit. Ich bezweifle, dass eine der syslog-spezifischen Methoden eine Lockerung bekommen würde.)
- 1. Wo speichert Linux mein Syslog?
- 2. TypeError: openlog() nimmt keine Schlüsselwortargumente
- 3. c/C++ syslog, um benutzerdefinierte Datei (nicht/var/log/syslog aber/var/log/mylog) - ubuntu 12.04
- 4. Sind BinaryFormatter serialisieren und deserialisieren threadsicher?
- 5. Sind Methodenparameter in Java threadsicher?
- 6. Sind statische Java-Initialisierer threadsicher?
- 7. Sind Python-integrierte Container threadsicher?
- 8. Sind Quartz-Scheduler-Instanzen threadsicher?
- 9. Welche Operationen im Knoten sind threadsicher?
- 10. Was bedeutet es "Unveränderliche Zeichenfolgen sind threadsicher"
- 11. Sind statische Variablen in GCC threadsicher?
- 12. Sind LoadLibrary, FreeLibrary und GetModuleHandle Win32-Funktionen threadsicher?
- 13. Sind die boost socket Lese- und Schreibfunktionen threadsicher?
- 14. Sind primitive Datentypen in C# atomar (threadsicher)?
- 15. Sind statische Methoden mit Out-Argumenten threadsicher?
- 16. Sind redis-Operationen auf Datenstrukturen threadsicher
- 17. Sind linq-Operationen für gleichzeitige Sammlungen threadsicher?
- 18. Sind Dapper QueryMultiple/Query/Execute Methoden threadsicher?
- 19. Welche Operationen sind threadsicher auf std :: map?
- 20. Sind die Zeitfunktionen von MSVC threadsicher?
- 21. Ist `asprintf` threadsicher?
- 22. BoundedPriorityBlockingQueue - threadsicher, blockierend und begrenzt?
- 23. Perl-Skripting für Syslog
- 24. Ist subprocess.Popen nicht threadsicher?
- 25. Warum sind Klassen wie BindingList oder ObservableCollection nicht threadsicher?
- 26. GNU Radio und labview
- 27. Standardausgabe an syslog umleiten
- 28. Syslog Zeitstempel ohne Jahr?
- 29. Log4net: SysLog Appender Beispiel
- 30. Syslog mit Strings?
Auf der Seite, die Sie verlinkt haben, befinden sich 'syslog()' usw. nicht im Abschnitt "Thread-Sicherheit", sondern unter "Thread-Löschung". Ich bin kein Concurrency-/Posix-Experte, aber das klingt nicht richtig. –
@AlexanderMalakhov Der Abschnitt, den Sie betrachten, besagt, dass ALLE Posix-Funktionen threadsicher sind, mit Ausnahme der folgenden. Und Syslog/etc. ist nicht Teil dieser Liste nicht threadsicherer Funktionen - daher sind sie Teil der Thread-sicheren Funktionen. – nos
@nos ah, richtig. Im Moment des ersten Kommentars dachte ich "soll sein" bedeutet "sollte sein", aber später erfuhr ich es ist "muss sein". Ich sollte erwähnen, meine anfänglichen Zweifel war von bestimmten Android 4.2-Implementierung, wo 'syslog 'Dateideskriptoren durchgesickert, wenn von mehreren Threads aufgerufen. –