段错误或者其他导致程序退出的错误一直以来都像蛮不讲理的莽汉一样,把我们辛辛苦苦开发的程序肆意破坏掉,留下一个或大或小的core文件让我们头疼去,我们痛哭流涕之后默默承受这份忧伤。。。
段错误由SIGEGV产生,可以被用户捕捉,也就给了我们保存程序重要数据的机会,借用glibc某函数处理SIGEGV的一个思路,我们可以把段错误变成一次会产生core文件的正常退出。
1.注册SIGEGV处理过程egv_handler。
2.SIGEGV处理过程egv_handler首先保存程序的关键数据,将必要数据持久化。
3.egv_handler的最后恢复SIGEGV的默认处理动作并重新抛出SIGEGV信号。
第三步骤的代码
/* Pass on the signal (so that a core file is produced). */
sa.sa_handler = SIG_DFL;
sigemptyset (&sa.sa_mask);
sa.sa_flags = 0;
sigaction (signal, &sa, NULL);
raise (signal);
sa.sa_handler = SIG_DFL;
sigemptyset (&sa.sa_mask);
sa.sa_flags = 0;
sigaction (signal, &sa, NULL);
raise (signal);
至此段错误对程序不再具有威胁性,吐槽一下,我实在不喜欢优雅这个形容词,程序员和程序都是理性的代码,用这么感性的装逼词汇,我自己都被感动的要吐了。