TLPI 21.3:在备选栈中处理信号:sigaltstack() 代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 static void sigsegvHandler(int sig) { int x; // 捕捉信号,并通过局部变量的位置来大致判断为当前函数所分配的空间处于什么位置 printf("Caught signal %d (%s)\n", sig, strsignal(sig)); printf("Top of handler stack near %10p\n", (void *)&x); // fflush(NULL)的作用是在程序异常终止前确保所有标准输出缓冲区的数据都被写入到相应的输出设备。 fflush(NULL); _exit(EXIT_FAILURE); } static void overflowStack(int callNum) { char a[100000]; // 此类分配数组方式为栈上分配 printf("Call %4d - top of stack near %10p\n", callNum, &a[0]); overflowStack(callNum + 1); // 无限递归调用,不断在栈上分配空间,每次分配100000字节以上 } int main(int argc, char *argv[]) { stack_t sigstack; struct sigaction sa; int j; printf("Top of standard stack is near %10p\n", (void *)&j); // 分配备用栈并通知内核 // 在堆当中分配备用栈 sigstack....