我想为linux编写一个c ++程序,它监视所有正在运行的进程,并在由于sigsegv而导致任何进程崩溃时写入日志文件。
是否可以这样做,如果是这样,我应该学习什么才能在c ++中实现它?
答案 0 :(得分:4)
尝试监控系统上的所有进程将是繁重的。如果您对SIGSEGV特别感兴趣,可能需要考虑将自己安装为核心转储处理程序。它不会捕获要求禁用核心转储的进程(ulimit -c 0
),但是您将获得所有其他进程。
echo "|usr/local/sbin/crashcollector" >/proc/sys/kernel/core_pattern
现在每次进程崩溃时,都会在其标准输入上调用核心转储来调用/usr/local/sbin/crashcollector
。该程序可以执行任何操作,例如保存核心转储和/或通知其他内容。
答案 1 :(得分:4)
我希望你能抓住所有进程崩溃事件。使用ptrace是一种方法,但它非常复杂,您需要跟踪所有进程并附加到以后创建的新进程,您也会遇到性能损失。
您可以通过挂钩coredump
捕获所有进程崩溃事件:
echo "|yourcoredumphook" > /proc/sys/kernel/core_pattern
这将启用coredump挂钩,当进程终止时,yourcoredumphook
将以root身份启动,coredump通过stdin发送,因此您可以通过分析coredump找出终止哪个进程
答案 2 :(得分:0)
您可能希望使用ptrace
。看看这个问题:
how to intercept linux signals ? (in C)
我想为所有进程执行此操作需要重新实现init,或者可能是监视sys目录的系统,以便为每个进程调用ptrace
。