gnu syslog(),openlog()和closelog()线程安全吗?

时间:2013-12-18 20:41:29

标签: c linux gnu syslog

我一直在寻找一段时间,但还没有找到确定的答案。到目前为止我发现的唯一链接是here

3 个答案:

答案 0 :(得分:12)

根据POSIX Specification syslog(),openlog()和closelog()是线程安全的。

还有另一个线程可以回答这个问题,并且可以追溯到2009年。这是链接syslog_r for Linux?

答案 1 :(得分:5)

(当我正在进行这项实验时,@ 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个,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

答案 2 :(得分:4)

GNU Libc documentation for syslog将这些方法描述为当前&#34; MT-safe&#34;这是POSIX - 代表&#34;线程安全&#34;。

这些方法被描述为&#34; AS-Unsafe&#34; (即, unsafe 供异步信号处理程序使用)。

该文件还指出(截至2015年4月)这些规范是&#34;初步&#34;并且不保证在将来的所有版本中都是如此。 (我认为这个免责声明适用于对glibc API函数进行分类以及#34;安全&#34;属性的广泛概念,这仍然是一些正在进行的工作。我怀疑任何特定于syslog的方法都会让任何更松散的方法。)