gpt4 book ai didi

c - 记录事件-寻找好方法

转载 作者:太空宇宙 更新时间:2023-11-04 04:58:43 25 4
gpt4 key购买 nike

我创建了一个监视事件的程序。
我想以“正确的方式”记录这些事件。
目前我有一个字符串数组,log[500][100]。
每一行是一个字符串(最多100个),用于报告有关事件的内容。
我已经设置好了,这样数组中只保存最后500个事件。
之后,新事件将覆盖最旧的事件。
目前,我只是一直在数组中旋转,直到程序终止,然后我将数组写入一个文件。
接下来,我希望在不干扰事件处理和日志记录过程的情况下,随时实时查看日志。
我曾考虑过打开文件进行“附加”,但我担心的是:
(1)程序运行在一个树莓Pi上,它有一个作为“磁盘驱动器”的闪存。我相信在出现问题之前,闪存的写入周期是有限的。这个程序24/7“永远”运行,所以我担心“磁盘驱动器”会“磨损”。
(2)我几乎使用了RPi的所有CPU容量,所以我不想增加很多开销/CPU周期。
有经验的程序员如何解决这个问题?
请放轻松,这是我的第一个C程序。
[编辑]
我开始回顾所有的信息,我对Mark A关于tmpfs的建议很感兴趣。我更深入地研究了它,我确信这回答了我的问题。它允许在RAM而不是SD卡中创建文件。他们停电了,但我不在乎。
为了防止文件变大,我创建了一个双缓冲区方法。首先,我将500个事件写入文件A,然后切换到文件B。当500个事件写入文件B时,我关闭并重新打开文件A(删除内容并从0个事件开始),然后切换到写入文件A。每次写入后,我发现需要刷新(文件…),否则文件为空,直到fclose。
通常情况下,这是可以的,但现在我正在与一个讨厌的分割错误斗争,所以我希望尽可能多的了解正在发生的事情。当我犯错的时候,我从来没有得到我的财务报表。

最佳答案

欢迎使用堆栈溢出和C编程!一个充满可能的美好世界等着你。
我对你的情况有几点看法。
简短的总结是使用stdout并将输出文件管理委托给shell。
我个人思考的冗长、漫无边际的答案如下:
1:对于C程序来说,一个非常典型的事情就是不负责如何保持输出。您可能听说过“内置”文件句柄、stdinstdoutstderr。这些文件句柄(在正常情况下)始终可用于程序的输入(从stdin)和输出(stdoutstderr)。正如您可能猜到的那样,stdout通常用于常规输出,stderr通常用于错误/异常输出。对于C程序来说,非常典型的做法是简单地从stdin读取并输出到stdoutstderr,然后让其他东西(例如shell)来处理它们的实际情况。
例如,从stdin读取意味着您的程序可以用于键盘输入和文件读取,而无需更改程序代码。这同样适用于stdoutstderr;只需输出到那些文件句柄,并让用户决定这些句柄是应该转到屏幕还是重定向到文件。而且,因为stdoutstderr是单独的文件句柄,所以用户可以让它们转到单独的“目的地”。
在您的例子中,要实现这一点,请完全删除数组,并简单地

fprintf(stdout, "event notice : %s\n", eventdetailstring);

(或类似)每次你的程序有话要说。考虑到潜在的输出缓冲,也可以看看 fflush()
2a:这可以让你连续输出。这本身有助于解决您对Pi的闪存盘内存损耗的担忧。如果你这样做:
eventmonitor > logfile

然后 logfile将在程序的生命周期中被附加到,这将倾向于写入闪存的新部分。当然,如果只追加,最终会耗尽磁盘空间,因此可以设置一个 cron作业来终止当前运行的 eventmonitor并每天午夜重新启动它。完成上述命令后,将导致它每天覆盖 logfile一次。这防止了无休止的增长,它甚至可能使用新文件的闪存驱动器的一个新的物理区域(即使它是相同的名称;下面是一个不同的文件,具有不同的inode等),但即使它重用了闪存驱动器的完全相同的区域,现在你也要担心这是否会持续超过10000天,而不是10000个字。我打赌在10000天内,新的选择将是可用的——最坏的情况下,你买一个新的圆周率每27年左右!
关于这个主题还有其他可能的变化。例如,你可以有一个复杂的脚本,每天午夜由 cron启动,杀死任何当前运行的 eventmonitor,删除一周以上的输出文件,并开始一个新的 eventmonitor输出到文件名部分基于日期的文件,这样过去几天的文件就不会被覆盖。但所有这些都是在使用你的程序的领域。通过编写程序以使用 stdinstdoutstderr,可以使程序更易于使用。
2b:或者,您可以让 stdout转到屏幕,这通常是当程序从交互式shell/终端窗口启动时的情况。我想大部分时间你都可以让Pi无头运行,当你想看到你的程序正在输出什么时,连接一个监视器。通常情况下,在断开和重新连接显示器之间会保持运行状态。这完全避免了影响闪存驱动器。
3:另一种方法是让事件监视程序将其输出发送到系统之外的某个地方。这将进入更高级的编程领域,所以在掌握了更多的基础知识之后,您可能希望将其保存下来,以便以后进行增强。但是,您的程序可以建立到JSON API的网络连接,并在那里发送事件信息。这样可以将事件监视和事件报告的功能分开。
当你学习更多的编程时,你会发现这种关注点分离的思想是一个重要的概念,并且适用于一个程序或一个互操作程序系统的各个层次。在这种情况下,Pi作为一种轻量级的解决方案非常适合于数据监控方面,而其他一些容量更大、存储更稳定的系统可以覆盖数据采集方面。

关于c - 记录事件-寻找好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57063894/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com