fwrite原子?

时间:2010-02-08 09:17:51

标签: c file-io atomic

一个简单的问题:

我需要在我的程序中添加一些日志记录。

如果两个进程在同一个文件上使用“fwrite”但文件描述符不同,那么写入的日志消息将是原子的或混合的。有长度限制吗?

是否定义了ANSI-C行为或实现? 如果以后什么是MacOSX,Linux和Windows MSVC?

4 个答案:

答案 0 :(得分:14)

经过一些研究后,我在link中找到了以下内容:

  

POSIX标准要求C stdio   FILE *操作是原子的。   符合POSIX的C库(例如,开启   Solaris和GNU / Linux)有一个   内部互斥锁以序列化操作   在FILE * s。

看起来调用应该是原子的,但这取决于你的平台。在同一个链接中,还有另一段让你认为程序员应该注意:

  

因此,对于3.0,“问题是”   多线程安全的I / O“必须是   回答说,“是你的平台的C   I / O的库线程安全吗?“有些是   默认情况下,有些不是;许多提议   C的多个实现   具有不同权衡的图书馆   线程安全和效率。你,   程序员,总是需要   小心多线程。

此外,由于您在两个不同的流程中有两个不同的FILE*,我认为您别无选择。

答案 1 :(得分:3)

它可以混合。

如果您有多个线程/进程写入同一文件,则需要使用锁定。

另一种方法是将日志消息发送到专用服务/线程。一个很好的工具是syslog,它肯定会安装在所有unix上,并且可以在Windows上运行。

答案 2 :(得分:1)

来自Debian lenny的“man flockfile”,stdio函数是线程安全的。

有线程不安全的stdio函数,“man unlocked_stdio”了解更多细节。

您可以从手册页获取更多信息。

答案 3 :(得分:-1)

视觉工作室的fwrite锁定调用线程,因此是线程安全的