我想为在不同服务器上运行的多个程序编写一个信号处理函数,以便当它们遇到故障时,例如段错误 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/