我创建了一个监视事件的程序。 我想“以正确的方式”记录这些事件。 目前,我有一个字符串数组log [500] [100]。 每行是一个字符串(最多100个),用于报告有关事件的信息。 我进行了设置,以便仅将最后500个事件保存在数组中。 之后,新事件将覆盖最早的事件。
目前,我只是不断旋转数组,直到程序终止,然后将数组写入文件。
展望未来,我希望随时随地实时查看日志,而不会干扰事件处理和日志记录过程。
我考虑打开文件进行“附加”操作,但这是我的担忧:
(1)程序在具有闪存作为“磁盘驱动器”的Raspberry Pi上运行。我相信,在出现问题之前,闪存的写周期数量有限。该程序“永远”运行24/7,因此恐怕“磁盘驱动器”将“用完”。
(2)我几乎使用了RPi的所有CPU容量,所以我不想增加很多开销/ CPU周期。
经验丰富的程序员将如何解决这个问题?
请放心,这是我的第一个C程序。
[编辑] 我开始审查所有信息,并被Mark A对tmpfs的建议所吸引。我进行了更多调查,我确信这可以回答我的问题。它允许在RAM而非SD卡中创建文件。它们掉电后会丢失,但我不在乎。 为了防止文件变大,我创建了一个双缓冲区方法。首先,我将500个事件写入文件A,然后切换到文件B。将500个事件写入文件BI后,关闭并重新打开文件A(以删除内容并从0个事件开始),然后切换为写入文件A。每次写入后需要fflush(file ...),否则文件为空,直到fclose。 通常这没关系,但是现在我正在解决令人讨厌的细分错误,因此我想对正在发生的事情有更多的了解。当我遇到错误时,我再也不会进入fclose语句。
答案 0 :(得分:-1)
欢迎您使用Stack Overflow和C编程!美好的世界充满着等待着你。
针对您的情况,我有几点想法。
非常简短的摘要是使用stdout
并将输出文件管理委托给Shell。
充满个人沉思的更长而漫不经心的答案如下:
1:对于C程序来说,非常典型的事情是不负责如何保持输出。您可能已经听说过“内置”文件句柄stdin
,stdout
和stderr
。这些文件句柄在正常情况下始终可供您的程序用于输入(来自stdin
)和输出(stdout
和stderr
)。您可能会从它们的名称中猜出stdout
通常用于常规输出,而stderr
通常用于错误/异常输出。对于C程序来说,仅从stdin
读取并输出到stdout
和stderr
,然后让其他东西(例如shell)来获取数据,这是非常典型的关心那些实际上是什么。
例如,从stdin
进行读取意味着您的程序可以用于键盘输入和用于文件读取,而无需更改程序代码。 stdout
和stderr
也是如此;只需将其输出到那些文件句柄,然后让用户决定是将其转到屏幕还是将其重定向到文件。而且,由于stdout
和stderr
是单独的文件句柄,因此用户可以使它们转到单独的“目的地”。
要实现此目的,请完全删除数组,然后简单地
fprintf(stdout, "event notice : %s\n", eventdetailstring);
每次您的程序有话要说时(或类似内容)。由于可能存在输出缓冲,因此也请注意fflush()
。
2a:这可以使您连续输出。这本身可以帮助您担心Pi的闪存盘上的内存磨损。如果您执行以下操作:
eventmonitor > logfile
然后logfile
将在程序的生命周期内附加到程序中,这将趋向于写入闪存的新部分。当然,如果仅执行追加操作,最终将耗尽磁盘空间,因此您可能会设置cron
作业来杀死当前正在运行的eventmonitor
,并每天午夜重新启动它。使用上述命令执行此操作,将导致它每天覆盖logfile
一次。这样可以防止无休止的增长,并且甚至可能为新文件使用闪存驱动器的新物理区域(即使它是相同的名称;在下面是一个不同的文件,具有不同的inode等)。 。)但是,即使它重复使用了闪存驱动器的完全相同的区域,现在您也要担心这将持续超过10,000天,而不是10,000次写入。我敢打赌,在10,000天内,将有新的选择可用-最坏的情况是,您每27年左右购买一次新的Pi!
此主题也有其他可能的变化。例如,您可能有一个复杂的脚本,每天cron
在午夜开始时,会杀死当前运行的eventmonitor
,删除一个星期之前的输出文件,并开始一个新的eventmonitor
输出到一个文件名部分基于日期的文件,因此过去的文件不会被覆盖。但这一切都在使用您的程序中。您可以通过编写使程序更易于使用,使其使用stdin
,stdout
和stderr
。
2b:或者,您可以只使stdout
进入屏幕,这通常是从交互式shell /终端窗口启动程序时的样子。我想您可以使Pi在大多数情况下无头运行,并且当您想查看程序输出的内容时,请连接一个监视器。通常,在断开与重新连接显示器之间,一切都会持续进行。这样可以完全避免影响闪存驱动器。
3:另一种方法是让事件监视程序将其输出发送到系统外某个地方。这正在进入更高级的编程领域,因此,您在掌握了更多基础知识之后,可能希望将其保存以供以后增强。但是,您的程序可以建立与JSON API的网络连接,并在那里发送事件信息。这样您就可以将事件监视和事件报告的功能分开。
在学习更多编程知识后,您会发现关注点分离的概念很重要,并且适用于程序的各个级别或互操作程序的系统。在这种情况下,Pi非常适合数据监视方面,因为它是一种轻量级的解决方案,并且其他一些具有更大容量和更稳定存储的系统也可以覆盖数据收集方面。