2013-12-18 8 views

Antwort

12

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?.

+0

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. –

+0

@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

+0

@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. –

5

(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 
+6

Beachten Sie, dass der Nachweis von Fehlern durch Tests ziemlich schwierig und normalerweise unmöglich ist. – nos

+0

Es war mehr ein Experiment, um zu sehen, was passieren würde, wenn wir mehrere Threads parallel zum syslog schreiben würden. – rkyser

4

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.)

Verwandte Themen