alv*_*its 13
根据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);
}
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)
的GNU Libc文档syslog将方法描述为当前的“ MT安全”,而POSIX则将其称为“线程安全”。
这些方法被描述为“ AS-Unsafe”(也就是说,从异步信号处理程序使用时是不安全的)。
该文档还指出(截至2015年4月),这些规范是“初步的”,不能保证在所有将来的版本中都正确。(我认为此免责声明适用于对glibc API函数的“安全”属性进行分类的广泛思想,并且这项工作仍在进行中。我怀疑任何特定于syslog的方法都会变得更加宽松。)
| 归档时间: |
|
| 查看次数: |
6336 次 |
| 最近记录: |