gnu syslog()、openlog()和closelog()是否线程安全?

gnu syslog()、openlog()和closelog()是否线程安全?,c,linux,gnu,syslog,C,Linux,Gnu,Syslog,我已经搜索了一段时间,还没有找到确切的答案。到目前为止,我找到的唯一能说明这一点的链接是。根据syslog(),openlog()和closelog()是线程安全的 还有另一条线索也回答了这个问题,它可以追溯到2009年。这是链接。(当我在做这个实验时,@user3088572回答了这个问题。既然我已经完成了一半,我还是会把它贴出来的。) 答案是“是的”,但这完全是由实验决定的 来源 主进程生成三个线程并等待,而所有线程同时打印不同的字符串。然后在1秒钟后,它告诉他们所有人停止并退出 #incl

我已经搜索了一段时间,还没有找到确切的答案。到目前为止,我找到的唯一能说明这一点的链接是。

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

还有另一条线索也回答了这个问题,它可以追溯到2009年。这是链接。

(当我在做这个实验时,@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);
}
将这些方法描述为当前的“MT-safe”,即POSIX所说的“线程安全”

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


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

注意,通过测试来证明没有bug是相当困难的,通常是不可能的。这更像是一个实验,看看如果我们让多个线程同时写入系统日志会发生什么。在您链接的页面上,
syslog()
etc不在“线程安全”部分,而是在“线程取消”部分。我不是并发/posix专家,但这听起来不对。@AlexanderMalakhov您正在查看的部分说,除以下函数外,所有posix函数都是线程安全的。而syslog/etc不是非线程安全函数列表的一部分-因此它们是线程安全函数的一部分。@nos啊,对了。在第一次发表评论时,我认为
应该是
意思是
应该是
,但后来我知道它的
必须是
。我应该提到的是,我最初的怀疑来自于特定的Android 4.2实现,当从多个线程调用时,
syslog
泄漏了文件描述符。是的,但决不要想当然地认为glibc文档是POSIX标准的正确解释。glibc对syslog使用localtime,但musl使用gmtime,POSIX隐式地建议gmtime超过localtime。syslog()未指定为依赖于环境,因此不允许调用行为依赖于环境的任何函数。
$ 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