c++ - 当程序出现故障时,信号处理函数中如何写入日志并将日志上传到MYSQL?

标签 c++ signal-handling

我想为在不同服务器上运行的多个程序编写一个信号处理函数,以便当它们遇到故障时,例如段错误 SIGSEGV 或 SIGTERM 等,信号处理函数可以生成日志并将内容上传到中央 MYSQL 服务器。这是为了通知管理员识别个别服务器并纠正问题。根据我的研究,我应该使用 sigaction 或异常处理。

问题 1:就我的目的而言,我应该使用哪种(信号处理或异常处理)?

问题 2:我读到不建议在信号处理函数中调用不可重入函数,例如打印()。在这种情况下,如何生成日志文件?我什至可以连接到 MYSQL 以上传信号处理函数中的日志吗?

我正在使用 C++ 和 Linux。非常感谢阅读。

最佳答案

你是对的,每个程序都应该对信号做出一些自己的 react !

Q1:使用sigaction(),它比之前的signal()更加精细。

问题 2:

  • 信号处理对于整个过程都是原子的。如果您确定不产生第二个 SIGSEGV,则可以使用 printf()。
  • 通过 sigaction,您可以为信号处理程序保留少量堆栈。如果程序遇到堆栈溢出,这个剩余的堆栈很有用。确保信号处理程序的操作适合剩余的堆栈。用 printf 写一个日志文件是可以的,但是网络库使用的堆栈不在你的控制之下。

关于c++ - 当程序出现故障时,信号处理函数中如何写入日志并将日志上传到MYSQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37342939/

相关文章:

c++ - 琐碎的任务

c - 从信号处理程序内部的共享资源读取

linux - 进程如何杀死自己?

c++ - 分而治之是否总能获得更好的表现?

c++ - 如何编写一个可以接受函数指针和/或仿函数的类,就像智能​​指针对自定义删除器所做的那样?

c++ - 找不到-lMagick++-6.Q16

c++ - cmake 在哪里寻找包?

c++ - 即使程序刚刚启动,是否也可以始终捕获信号?

c++ - 如何捕获两个以上的连续信号?

linux - 如何在 Linux 内核中用用户定义的处理程序替换默认处理程序来处理生成核心转储的异常?