一个简单的问题:
我需要在我的程序中添加一些日志记录。
如果两个进程在同一个文件上使用“fwrite”但文件描述符不同,那么写入的日志消息将是原子的或混合的。有长度限制吗?
是否定义了ANSI-C行为或实现? 如果以后什么是MacOSX,Linux和Windows MSVC?
答案 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锁定调用线程,因此是线程安全的