Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C对日志文件的多写访问(linux环境)_C_Linux_Syslog - Fatal编程技术网

C对日志文件的多写访问(linux环境)

C对日志文件的多写访问(linux环境),c,linux,syslog,C,Linux,Syslog,我有一套用C编写的独立程序。我希望所有程序都将日志写入同一个文件。显然,控制访问的问题也随之而来。他们中的两个或更多人最终可能同时写作 实现这一目标最务实的方式是什么 我遇到过使用pthread/mutexes/etc的解决方案,但对于类似的实现来说,这听起来有些过头了 我也在查看syslog,但不知道这是否真的是为了我需要做的事情 我觉得我需要一个守护进程服务,在编写消息和控制时接收它们。我想知道这是否已经存在 我也在查看syslog,但不知道这是否真的是为了我需要做的事情 对 我觉得我需要一

我有一套用C编写的独立程序。我希望所有程序都将日志写入同一个文件。显然,控制访问的问题也随之而来。他们中的两个或更多人最终可能同时写作

实现这一目标最务实的方式是什么

我遇到过使用pthread/mutexes/etc的解决方案,但对于类似的实现来说,这听起来有些过头了

我也在查看syslog,但不知道这是否真的是为了我需要做的事情


我觉得我需要一个守护进程服务,在编写消息和控制时接收它们。我想知道这是否已经存在

我也在查看syslog,但不知道这是否真的是为了我需要做的事情


我觉得我需要一个守护进程服务,在编写消息和控制时接收它们。我想知道这是否已经存在

它存在于Unix衍生产品(包括Linux)中,称为<代码>syslogd

更严重的是,
syslog
函数旨在将消息传递给
syslogd
守护进程,该守护进程将根据其配置文件对其进行路由。最常见的用途包括将其写入文件或系统控制台(特别是在没有人能够确定文件系统是否仍然可访问时用于紧急级别的消息)。syslog系统可能具有比您所要求的更多的功能,但它是一个非常健壮且经过广泛测试的软件。此外,它肯定已经在您的系统上处于活动状态,因此您应该有充分的理由推出自己的,而不是使用它。

您有两种方法:

第一:使用已经存在的东西。 对于日志部分,syslog(和syslog ng)是众所周知的,并得到了很好的使用

从这一点上,您可以参数syslog ng来侦听ip连接,并扫描目录以查找新文件

您的程序可以在需要登录时直接连接到syslogng并发送日志,如果连接失败,则在syslogng监视的目录中写入一个新文件。 允许不丢失日志的是由于某种原因而中断的syslog ng

第二:开发真正类似于syslog ng的东西。
在这种情况下,这取决于您。

“我觉得我需要一个守护进程服务,在编写消息和控制时接收它们。我想知道这是否已经存在。”是的,这是syslog。这有点广泛。。。请指定其他约束条件,最好提供一些示例代码
syslog
是一个选项,但它基本上需要root访问权限来配置日志记录。如果您在
O_APPEND
模式下打开日志文件,并使用一个
write()
调用写入每条消息,我想您一定会得到想要的。我对您的评论感兴趣,因为这在短期内可能是一个不错的选项。使用O_APPEND模式,如果一个人在另一个人已经在写的时候尝试写,会发生什么。这会阻碍第二篇文章的写作吗?我会用这种方式挖掘和测试。这是在openwrt上运行的。syslog在那里被称为logd/logread,但我应该能够处理它。@Noel因为我们在这里讨论系统调用,所以几乎不需要问“如果一个人在另一个人已经在写的时候尝试写会发生什么”。如果操作系统内核是单线程的,那么单个系统调用本质上是原子的。而
O_APPEND
的定义是,它将每个
write()
调用转换为一个原子查找,以结束然后写入操作。我不确定在多处理器或其他多线程操作系统上会发生什么,但我非常确定操作系统内核会为您处理任何独占锁定。值得明确指出的是,syslog不仅仅用于系统日志消息。任何应用程序进程都可以使用它编写自己的、特定于应用程序的日志消息,这些消息可以路由到自己的、特定于应用程序的日志文件。