首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在MacOSX上,在C++程序中,我可以对文件IO提供什么保证

在MacOSX上,在C++程序中,我可以对文件IO提供什么保证
EN

Stack Overflow用户
提问于 2010-03-12 16:52:03
回答 2查看 233关注 0票数 3

我在MacOSX上。我正在写一个多线程程序。一个线程进行日志记录。非日志记录线程可能在任何时候崩溃。

我应该在记录器中采用什么约定/我可以得到什么保证?

我更喜欢这样一种解决方案,即使我在写入的一部分过程中崩溃,之前的写入仍然会写入磁盘,并且当我读回日志时,我可以计算出“啊,我写了100个完整的字符,然后我在第101个崩溃了”。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-03-12 22:28:43

我在Linux上编程,而不是在MacOSX上,但可能在那里也是一样的。

如果您的程序中只有一个线程记录日志,这意味着您在此日志记录线程中缓冲日志记录数据,然后它将其写入一个文件(可能是更大的部分),以避免过多的I/O操作,并使日志记录过程更快。

糟糕的是,如果一个线程出现分段,整个进程将与缓冲的数据一起被销毁。

我所知道的(针对Linux的)解决方案是:

  1. 通过套接字传输日志数据,而不使用缓冲日志线程(例如syslog)。在这种情况下,操作系统可能会处理写入套接字的数据,即使您的应用程序崩溃,数据也应该在另一端接收,并使用日志记录线程记录successfully.
  2. Don's,每个线程都可以同步记录到一个文件中。在这种情况下,日志数据在崩溃后的损失应该非常小或没有。但速度更慢。

我还不知道这个问题的更好的解决方案,但学习一个会很有趣。

票数 1
EN

Stack Overflow用户

发布于 2010-03-13 18:56:08

正如Dmitry所说,只有几个选项可以确保您真正捕获日志记录输出。你真的需要写你自己的吗?它真的需要在另一个线程上吗?当您通常希望同步记录时,这可能会为崩溃引入一个未命中日志的时间窗口。

Unix上的syslog工具是对系统服务进行可靠日志记录的标准方法。它基本上解决了你所描述的这些类型的问题(即。日志是在进程外处理的,所以如果你崩溃了,你的日志仍然会被保存)。

如果您的应用程序只针对Mac,那么您应该看看Apple System Log facility (ASL)。它提供了比syslog更复杂的应用程序接口及其功能的超集。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2431434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档