_GetExcData() - 获取异常数据

格式

#include <signal.h>
void _GetExcData(_INTRPT_Hndlr_Parms_T *parms);

语言级别

ILE C 扩展

线程安全

作业 CCSID 接口

发送到此函数的所有字符数据都应该使用作业的 CCSID。 此函数返回的所有字符数据都使用作业的 CCSID。 请参阅 了解 CCSID 和语言环境 以获取更多信息。

描述

_GetExcData() 函数从 C 信号处理程序中返回有关当前异常的信息。 _GetExcData() 函数的调用者必须为类型为 _INTRPT_Hndlr_Parms_T 的结构分配足够的存储空间。 如果从信号处理程序外部调用 _GetExcData() 函数,那么不会更新 parms 指向的存储器。

当在编译命令上指定 SYSIFCOPT (*ASYNCSIGNAL) 时,此功能不可用。 当指定 SYSIFCOPT (*ASYNCSIGNAL) 时,使用 ILE C signal() 函数建立的信号处理程序无法访问可能导致调用信号处理程序的任何异常信息。 但是,使用 sigaction() 函数建立的扩展信号处理程序可以访问此异常信息。 扩展信号处理程序具有以下函数原型:

void func( int signo, siginfo_t *info, void *context )

异常信息将附加到 siginfo_t 结构,然后将其作为第二个参数传递到扩展信号处理程序。

siginfo_t 结构在 signal.h中定义。 与异常相关的数据跟在 siginfo_t 结构中的 si_sigdata 字段后面。 您可以从 sigdata_t 结构的 se_data 字段对其进行寻址。

附加到 siginfo_t 结构的异常数据的格式由 except.h中的 _INTRPT_Hndlr_Parms_T 结构定义。

返回值

没有返回值。

示例

此示例显示如何使用信号处理函数来监视和处理来自 MI 库函数的异常。 在 rslvsp() 函数发出 0x2201 异常信号之前,将注册信号处理程序 my_signal_handler。 当发生 SIGSEGV 信号时,调用信号处理程序。 如果发生 0x2201 异常,那么信号处理程序将调用 QUSRCRTS API 以创建空间。
#include  <signal.h>
#include  <QSYSINC/MIH/RSLVSP>
#include  <QSYSINC/H/QUSCRTUS>
#include  <string.h>
 
#define CREATION_SIZE  65500
 
void my_signal_handler(int sig) {
 
   _INTRPT_Hndlr_Parms_T excp_data;
   int                   error_code = 0;
 
   /* Check the message id for exception 0x2201 */
   _GetExcData(&excp_data);
 
   if (!memcmp(excp_data.Msg_Id, "MCH3401", 7))
      QUSCRTUS("MYSPACE   QTEMP     ",
               "MYSPACE   ",
               CREATION_SIZE,
               "\0",
               "*ALL      ",
               "MYSPACE example for Programmer's Reference        ",
               "*YES      ",
               &error_code);
}
 

相关信息