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

Kon*_*oha 14 c linux gnu syslog

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

alv*_*its 13

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

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


rky*_*ser 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);
}
Run Code Online (Sandbox Code Playgroud)

结果

首先,没有核心转储或分段错误.这很好.

此外,在观察系统日志(见下文)时,我们可以看到没有消息具有混合字符.每一行是所有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
Run Code Online (Sandbox Code Playgroud)

  • 请注意,通过测试证明没有错误是非常困难的,而且通常是不可能的. (6认同)

P.T*_*.T. 5

GNU Libc文档syslog将方法描述为当前的“ MT安全”,而POSIX则将其称为“线程安全”。

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

该文档还指出(截至2015年4月),这些规范是“初步的”,不能保证在所有将来的版本中都正确。(我认为此免责声明适用于对glibc API函数的“安全”属性进行分类的广泛思想,并且这项工作仍在进行中。我怀疑任何特定于syslog的方法都会变得更加宽松。)