繁体   English   中英

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

[英]Are gnu syslog(), openlog() and closelog() thread-safe?

我一直在寻找一些时间,但还没有找到明确的答案。 到目前为止,我发现的唯一链接就是这里

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

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

(当我正在进行这个实验的时候,@ 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 ' S,或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

syslogGNU Libc文档将这些方法描述为当前“MT-safe”,POSIX代表“线程安全”。

这些方法被描述为“AS-Unsafe”(即,从异步信号处理程序使用时不安全 )。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM