我在一个嵌入式平台(mipsel体系结构,Linux 2.6内核)上,我需要在两个闭源进程(路由器固件)之间监视IPC,以便对某个事件做出反应(由于DSL重新连接,动态IP更改).到目前为止,我通过strace发现的是,无论何时IP发生变化,DSL守护进程都会将特殊消息写入绑定到特定文件名的UNIX域套接字.该消息由另一个守护程序使用.
现在这是我的要求:我想监视通过该特定UNIX域套接字的数据流,并在检测到某个消息时触发事件(调用shell脚本).我尝试使用inotify监视文件名,但它不适用于套接字文件.我知道我可以一直运行strace,过滤其输出并对过滤后的日志文件中的更改做出反应,但这样做太重了,因为strace确实会降低系统速度.我也知道我可以通过cron轮询IP地址,但是我想要一个看门狗,而不是一个轮询解决方案.我有兴趣了解是否有一个工具可以专门监视UNIX域套接字并对预定义方向流动的特定消息做出反应.我想象类似于inotifywait的东西,即工具应该等待某个事件,然后退出,这样我就可以对事件作出反应并循环回到再次启动工具,等待同一类型的下一个事件.
是否有任何现有的Linux工具能够做到这一点?或者是否有一些简单的C代码用于独立二进制文件,我可以在我的平台上编译(uClibc,而不是glibc)?我不是C专家,但能够运行makefile.使用shell中的二进制文件没问题,我对shell编程了解得足够多.
我正在使用Python Watchdog来监控Ubuntu上的文件夹.它可以正常使用1或2个文件,但是当我按命令移动50个文件时,mv *.xml dest_folder
它只收到2个事件并且只处理了2个文件.下面是代码.
def on_moved(self, event):
try:
logger.debug("on_moved event :" + str(event) )
self._validate_xml(event.dest_path)
except Exception as ex:
logger.exception(ex)
Run Code Online (Sandbox Code Playgroud)
如果我评论出_validate_xml
功能,那么我会收到所有45个事件.
任何人都可以告诉我看门狗到底发生了什么,最好的解决办法是什么?
在Ubuntu上运行,每次创建文件时我都会获得修改后的事件.
这是设计还是我做错了什么?
我正在使用事件处理程序类 PatternMatchingEventHandler
event_handler = MediaFileHandler(ignore_directories=True)
observer = Observer()
observer.schedule(event_handler, path=directory, recursive=True)
observer.start()
Run Code Online (Sandbox Code Playgroud)
如果这是正确的行为,我可以安全地忽略创建的事件吗?
我引用维基百科:
看门狗定时器(WDT;有时称为计算机正常运行或COP定时器,或简称为看门狗)是一个电子定时器,用于检测计算机故障并从中恢复.
在使用STM32F429I-Discovery时,我遇到了一个术语[in "stm32f4xx.h"
],它使用寄存器来禁用Watchdog:
#define ADC_CR1_AWDIE ((uint32_t)0x00000040) //Analog Watchdog interrupt enable
Run Code Online (Sandbox Code Playgroud)
在这里,我无法理解模拟看门狗
如果可能的话,
#define ADC_CR1_JAWDEN ((uint32_t)0x00400000) //Analog watchdog enable on injected channels
Run Code Online (Sandbox Code Playgroud)
什么是注入渠道?
从这里:http://www.sat.dundee.ac.uk/psc/watchdog/watchdog-testing.html
for n in $(seq 1 60); do echo $n; sleep 1; sync; done
我明白了:
:~$ sudo for n in $(seq 1 60); do echo $n; sleep 1; sync; done
bash: syntax error near unexpected token `do'
Run Code Online (Sandbox Code Playgroud) 我试图在我的代码中检索IRQ处理程序的返回地址.我的目标是在看门狗定时器到期之前和复位之前使用WDT_IRQHandler()保存PC的值以进行调试.我也在用其他IRQ测试这种方法来检查我是否掌握了这个想法.但似乎我没有.
我已经阅读了可用的文档.我知道当异常发生时,8个寄存器被推送到堆栈:R0,R1,R2,R3,R12,LR,PC和XPSR.
我还读过堆栈自动双字对齐.所以在我看来,检索返回地址就像这样简单:
检查附加的调试器,似乎不是这种情况,该内存地址的内容并不总是指向闪存区域,甚至指向有效区域,并且在任何情况下,它都不是PC在POP指令.
代码工作正常,所以我认为这是一个问题,我理解它是如何工作的.
如果我检查反汇编,在某些IRQ中,在POPping(?)之前向sp添加一个常量
00001924: 0x000009b0 ...TE_IRQHandler+280 add sp, #36 ; 0x24
00001926: 0x0000f0bd ...TE_IRQHandler+282 pop {r4, r5, r6, r7, pc}
Run Code Online (Sandbox Code Playgroud)
在其他IRQ中,这不会发生.
我知道可能会发生更多的寄存器被推送到堆栈,所以我如何确定在哪个偏移量来检索PC?
如果我在代码仍在IRQ处理程序中时检查SP周围的内存转储,我可以发现返回地址,但它始终位于一个奇怪的位置,与SP相比具有负偏移.我无法理解如何获得正确的地址.
我使用 STM32 (L0 5) HAL,在进入 STOP 模式之前,我需要禁用 IWDG 或 WWDG。在 IWDG 将 MCU 从 STOP 模式重置之前,以下代码可以正常工作。对于 WWDG 使用,这要快得多,并且在调用 HAL_PWR_EnterSTOPMode 之前重置,尽管 HAL_WWDG_Refresh 在每行之后调用。我也在 Nucleo L05 上测试了这些场景。
iwdgHandle.Instance = IWDG;
iwdgHandle.Init.Prescaler = IWDG_PRESCALER_64;
iwdgHandle.Init.Window = 4095;
iwdgHandle.Init.Reload = 4095;
if (HAL_IWDG_Init(&iwdgHandle) != HAL_OK) // almost 7secs until refresh has to be called
{
_Error_Handler(__FILE__, __LINE__);
}
HAL_PWR_EnableWakeUpPin(WakeSpi_Pin);
HAL_PWREx_EnableUltraLowPower(); // Enable Ultra low power mode
HAL_PWREx_EnableFastWakeUp(); // Enable the fast wake up from Ultra low power mode
HAL_SuspendTick();
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
Run Code Online (Sandbox Code Playgroud) 这篇文章不是要问如何使用它,而是何时使用它.
有很多关于窗口看门狗(WW)的文档,大多数微控制器已经包含它.每个供应商都声明WW适用于安全应用,但没有人更多地谈论这个主题.
我想指出一些具体的例子,但这些例子可能比"汽车制动系统"更多.
我们都知道WW必须既不太早也不太晚,但这种情况将如何有助于提高安全性?
谢谢!!
我遇到了一些我没有预料到的额外事件的问题。
我在看文件夹C:\Users\kvasko\Downloads\data
。如果我复制一个文件夹,2017\07\25\LogFile.xml
我将看到以下 3 个“创建”事件,而我希望只看到 1 个。如果我提前创建日期文件夹结构(但在应用程序运行时查看文件夹),它只会生成一个像我期望的那样的事件。我从来没有因为创建文件夹而收到事件。就像为创建文件夹而生成事件一样,但是在检查我的on_created(self,event)
所有三个外观事件上消息的实际事件时,它们看起来完全相同。这里发生了什么?
这是示例输出和最小示例。
2017-09-22 13:58:10,182 - root - INFO - Watchdog: file created C:\Users\kvasko\Downloads\data\2017\07\25\LogFile.xml
2017-09-22 13:58:11,184 - root - INFO - Watchdog: file created C:\Users\kvasko\Downloads\data\2017\07\25\LogFile.xml
2017-09-22 13:58:12,187 - root - INFO - Watchdog: file created C:\Users\kvasko\Downloads\data\2017\07\25\LogFile.xml
Run Code Online (Sandbox Code Playgroud)
我希望:
2017-09-22 13:58:12,187 - root - INFO - Watchdog: file created C:\Users\kvasko\Downloads\data\2017\07\25\LogFile.xml
Run Code Online (Sandbox Code Playgroud)
有没有办法从文件夹创建中检测它是否实际上有多个事件?
以下是我的观察者配置。
folder = "C:\\Users\\kvasko\\Downloads\\data"
observer = Observer(MyProcessHandler(patterns=["*.xml"]), folder, recursive=True)
observer.start_observer()
os.mkdirs("C:\\Users\\kvasko\\Downloads\\data\\2017\\07\\25")
shutil.copy2("C:\temp\LogFile.xml", "C:\\Users\\kvasko\\Downloads\\data\\2017\\07\\25")
try:
while True:
time.sleep(5)
except:
print("Error")
Run Code Online (Sandbox Code Playgroud)
以下是我的处理程序类。
import …
Run Code Online (Sandbox Code Playgroud) 在 Linux(在 ARM 上运行)中,有一个进程有一个打开的 fd ,并且每隔几秒/dev/watchdog/
发送一个fd 作为保持活动状态:ioctl()
while (1) {
ioctl(fd, WDIOC_KEEPALIVE, 0);
sleep(10);
}
Run Code Online (Sandbox Code Playgroud)
我也想从另一个进程发送保持活动状态,但我无法打开另一个 fd /dev/watchdog/
:当我尝试回显时,/dev/watchdog/
我收到错误“设备或资源忙”。
我在哪里可以看到看门狗被定义为一次仅适用于 1 个进程?(我在另一个Linux中看到有些进程可以打开fd /dev/watchdog/
)。
我该怎么做才能从两个进程喂养看门狗?