- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我创建了一个监视事件的程序。
我想以“正确的方式”记录这些事件。
目前我有一个字符串数组,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程序来说,一个非常典型的事情就是不负责如何保持输出。您可能听说过“内置”文件句柄、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()
。
eventmonitor > logfile
logfile
将在程序的生命周期中被附加到,这将倾向于写入闪存的新部分。当然,如果只追加,最终会耗尽磁盘空间,因此可以设置一个
cron
作业来终止当前运行的
eventmonitor
并每天午夜重新启动它。完成上述命令后,将导致它每天覆盖
logfile
一次。这防止了无休止的增长,它甚至可能使用新文件的闪存驱动器的一个新的物理区域(即使它是相同的名称;下面是一个不同的文件,具有不同的inode等),但即使它重用了闪存驱动器的完全相同的区域,现在你也要担心这是否会持续超过10000天,而不是10000个字。我打赌在10000天内,新的选择将是可用的——最坏的情况下,你买一个新的圆周率每27年左右!
cron
启动,杀死任何当前运行的
eventmonitor
,删除一周以上的输出文件,并开始一个新的
eventmonitor
输出到文件名部分基于日期的文件,这样过去几天的文件就不会被覆盖。但所有这些都是在使用你的程序的领域。通过编写程序以使用
stdin
、
stdout
和
stderr
,可以使程序更易于使用。
stdout
转到屏幕,这通常是当程序从交互式shell/终端窗口启动时的情况。我想大部分时间你都可以让Pi无头运行,当你想看到你的程序正在输出什么时,连接一个监视器。通常情况下,在断开和重新连接显示器之间会保持运行状态。这完全避免了影响闪存驱动器。
关于c - 记录事件-寻找好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57063894/
我正在尝试将 WPF CodeBehid 事件(如 Event、Handler、EventSetter)转换为 MVVM 模式。我不允许使用 System.Windows.Controls,因为我使用
我可能误解了 Backbone 中的事件系统,但是当我尝试以下代码时什么也没有发生。当我向 Backbone.Events 扩展对象添加新属性时,它不应该触发某种更改、更新或重置事件吗?就像模型一样吗
我遇到了一个简单的问题,就是无法弄清楚为什么它不起作用。我有一个子组件“app-buttons”,其中我有一个输入字段,我想听,所以我可以根据输入值过滤列表。 如果我将输入放在我有列表的根组件中,一切
System.Timers.Timer 的 Elapsed 事件实际上与 System.Windows.Forms.Timer 的 Tick 事件相同吗? 在特定情况下使用其中一种比使用另一种有优势吗
嗨,这个 javascript 代码段是什么意思。(evt) 部分是如此令人困惑.. evt 不是 bool 值。这个怎么运作? function checkIt(evt) { evt
我正在使用jquery full calendar我试图在事件被删除时保存它。 $('calendar').fullCalendar ({
我有两个链接的鼠标事件: $('body > form').on("mousedown", function(e){ //Do stuff }).on("mouseup", function(
这是我的代码: $( '#Example' ).on( "keypress", function( keyEvent ) { if ( keyEvent.which != 44 ) {
我尝试了 dragOver 事件处理程序,但它没有正常工作。 我正在研究钢琴,我希望能够弹奏音符,即使那个键上没有发生鼠标按下。 是否有事件处理程序? 下面是我正在制作的钢琴的图片。 最佳答案 您应该
当悬停在相邻文本上时,我需要使隐藏按钮可见。这是通过 onMouseEnter 和 onMouseLeave 事件完成的。但是当点击另外的文本时,我需要使按钮完全可见并停止 onMouseLeave
我有ul标签内 div标签。我申请了mouseup事件 div标记和 click事件 ul标签。 问题 每当我点击 ul标签,然后都是 mouseup和 click事件被触发。 我想要的是当我点击 u
我是 Javascript 和 jQuery 的新手,所以我有一个非常愚蠢的疑问,请耐心等待 $(document).click(function () { alert("!"); v
我有一个邮政编码解析器,我正在使用 keyup 事件处理程序来跟踪输入长度何时达到 5,然后查询服务器以解析邮政编码。但是我想防止脚本被不必要地调用,所以我想知道是否有一种方法可以跟踪 keydown
使用事件 API,我有以下代码来发布带有事件照片的事件 $facebook = new Facebook(array( "appId" => "XXX", "se
首次加载 Microsoft Word 时,既不会触发 NewDocument 事件也不会触发 DocumentOpen 事件。当 Word 实例已打开并打开新文档或现有文档时,这些事件会正常触发。
我发现了很多相关问题(这里和其他地方),但还没有具体找到这个问题。 我正在尝试监听箭头键 (37-40) 的按键事件,但是当以特定顺序使用箭头键时,后续箭头不会生成“按键”事件。 例子: http:/
给定的 HTML: 和 JavaScript 的: var $test = $('#test'); $test.on('keydown', function(event) { if (eve
我是 Node.js 的新手,希望使用流运行程序。对于其他程序,我必须同时启动一个服务器(mongodb、redis 等),但我不知道我是否应该用这个运行一个服务器。请让我知道我哪里出了问题以及如何纠
我正在尝试使用 Swift 和 Cocoa 创建一个适用于 OS X 的应用程序。我希望应用程序能够响应关键事件,而不将焦点放在文本字段上/文本字段中。我在 Xcode 中创建了一个带有 Storyb
我有以下代码: (function(w,d,s,l,i){ w[l]=w[l]||[];w[l].push({
我是一名优秀的程序员,十分优秀!