如何获取 iOS 上的当前信号处理程序?

How to get current signal handler on iOS?

您好,我需要获取使用此方法设置的当前信号处理程序:

signal(SIGSEGV, handler);

怎么做?

不幸的是,C 标准没有预见到读取处理程序的当前值。

但幸运的是,当您更改处理程序时,signal() return 是以前的值。因此,您可以冒一点风险:

typedef void (*sighandler_t)(int);  /* for convenience */

sighandler_t current_handler; 
current_handler = signal(SIGSEGV, SIG_IGN);  /* (1) */
signal (SIGSERV, current_handler); /* (2) */

有两个风险:

  • 可能存在(非常不可能的)错误导致 signal() 到 return SIG_ERR。然后您将永远失去当前的处理程序!根据上面的 iOS 手册页,根据您感兴趣的信号值,不满足错误条件。
  • 如果在 (1) 和 (2) 之间出现 SIGSEGV,您将不会拦截它。但是,查看这两个语句,它们不太可能触发分段违规 (SIGSEGV)