Подтвердить что ты не робот

Являются gnu syslog(), openlog() и closelog() потокобезопасными?

Я искал какое-то время и еще не нашел окончательного ответа. Единственная ссылка, которую я нашел до сих пор, которая проливает некоторый свет на это, здесь.

4b9b3361

Ответ 1

В соответствии с Спецификация POSIX syslog(), openlog() и closelog() являются потокобезопасными.

Там есть еще одна тема, которая также отвечает на этот вопрос и датируется еще в 2009 году. Здесь ссылка syslog_r для Linux?.

Ответ 2

(В то время как я работал над этим экспериментом, @user3088572 ответил на вопрос. Поскольку у меня было это на полпути, я все равно отправлю его.)

Ответ "Да", но это было определено исключительно экспериментами.

Источник

Основной процесс запускает три потока и ждет, пока потоки все печатают разные строки в одно и то же время. Затем через 1 секунду он сообщает им, чтобы все останавливались и выходили.

#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);
}

Результаты

Прежде всего, не было никаких дампов ядра или ошибок сегментации. Так что хорошо.

Также, наблюдая системные журналы (см. ниже), мы видим, что ни одно из сообщений не имеет смешанных символов. Каждая строка имеет либо 1 's, 2', либо 3 '.

$ 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

Ответ 3

Документация GNU Libc для syslog описывает методы, как в настоящее время "MT-safe", который является POSIX-talk для "потокобезопасных" ".

Методы описываются как "AS-Unsafe" (то есть небезопасные для использования от асинхронного обработчика сигналов).

В документе также отмечается (по состоянию на апрель 2015 года), что эти спецификации являются "предварительными" и не гарантируются во всех будущих версиях. (Я думаю, что это выражение об отказе распространяется на широкую идею категоризации свойств функций безопасности glibc API, и это все еще немного работает. Я сомневаюсь, что любой из методов, специфичных для syslog, будет иметь все более слабое.)