fwrite原子?

Lot*_*har 12 c file-io atomic

一个简单的问题:

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

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

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

yey*_*man 16

做了一些研究后,我在这个链接中找到了以下内容:

POSIX标准要求C stdio FILE*操作是原子的.符合POSIX的C库(例如,在Solaris和GNU/Linux上)具有内部互斥锁,用于序列化FILE*上的操作.

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

因此,对于3.0,"多线程安全I/O"的问题必须回答,"您的平台的C库线程是否适用于I/O?" 有些是默认的,有些则不是; 许多提供C库的多个实现,具有不同的线程安全性和效率.作为程序员,您始终需要注意多个线程.

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

  • 同样在 Windows 上,`fwrite` 是原子的。[source](https://msdn.microsoft.com/en-us/library/h9t88zwz.aspx?f=255&MSPPError=-2147217396):*因为这个函数锁定了调用线程,所以是线程安全的。对于非锁定版本,请参阅 _fwrite_nolock。* (2认同)

Wil*_*ill 5

它可以混合使用。

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

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