我有一个应用程序监视高速通信链接并将日志写入文件(通过标准C文件IO)。到达链接的消息的响应时间很重要,因此我故意不在每条消息上fflush
文件,因为这会减慢我的响应时间。
但是,在某些情况下,我的应用程序会“暴力”终止(例如通过终止进程),并且在这些情况下,最后几条日志消息不会被写入(即使通信链接已经安静了一段时间)。< / p>
我可以使用哪些技巧/策略来确保我的大部分数据都已刷新,但却没有放弃响应速度?
编辑:应用程序在Windows上运行
答案 0 :(得分:4)
使用线程是此的标准解决方案。让您的数据收集代码将数据写入线程安全队列,并使用信号量来通知写入线程。
但是,在你去那里之前,请仔细检查你的断言fflush()会很慢。大多数操作系统都有文件系统缓存。它使写入速度非常快,因为简单的内存到内存块复制。数据被懒惰地写入磁盘,崩溃不会影响它。
答案 1 :(得分:3)
如果您使用的是Unix或Linux,则您的流程会收到一些termination signal,您可以在信号处理程序中捕获(SIGKILL
)和fflush()
。
有关信号捕捉,请参阅man sigaction
。
答案 2 :(得分:1)
我建议使用异步写入。这样你就不需要等待写IOP发生,操作系统也不会延迟IOP。请参见CreateFile()标志FILE_FLAG_WRITE_THROUGH | FILE_FLAG_OVERLAPPED
。
您不需要FILE_FLAG_NO_BUFFERING
。那只是跳过操作系统缓存。如果你担心整个操作系统会剧烈死亡,你只需要它。
答案 3 :(得分:-1)
如果程序通过调用exit()或从main()返回来终止,则C标准保证刷新和关闭打开的流,因此不需要特殊处理。从您的描述中听起来就像这是正在发生的事情:如果您的程序因信号而死亡,您将看不到同花顺。
我无法理解问题究竟是什么。
如果只是你试图在经常刷新和默认的完全缓冲输出之间找到一个快乐的媒介,那么也许你想要的是行缓冲:
setvbuf(stream, 0, _IOLBF, 0);