structsigaction结构体内容如下:structsigaction{ void(*sa_handler)( int); void(*sa_sigaction)( int, siginfo_t*, void*); sigset_tsa_mask; intsa_flags; void(*sa_restorer)( void); }; 如果sa_flags设置为 SA_SIGINFO,说明了信号处理程序带有附加信息,也就是会调用 void(*sa_sigaction)(int, sigi...
struct sigaction结构体介绍 structsigaction{void(*sa_handler)(int);void(*sa_sigaction)(int,siginfo_t*,void*);sigset_tsa_mask;intsa_flags;void(*sa_restorer)(void);} 联合数据结构中的两个元素_sa_handler以及_sa_sigaction指定信号关联函数,即用户指定的信号处理函数。除了可以是用户自定义的处理函数外,...
sigaction()函数只能在POSIX支持的系统上使用(POSIX:Portable Operating System Interface of UNIX,可以指操作系统接口。其定义了操作系统应该为应用程序提供的标准接口) 2. sigaction结构体 struct sigcation { void (*sa_handler)(int); void (*sa_sigaction)(int, siginfo_t*, void*); sigset_t sa_mask; int...
一个信号的相关信息在内核中用siginfo_t结构体表示: siginfo_t{ int si_signo; int si_sicode; union __sifields _sifields; ... } si_signo是信号的编号,从1到64的值都是合法的。 si_sicode记录了信号的来源,比如SI_USER表示信号是由进程调用kill()发出的,SI_QUEUE是由进程调用sigqueue()发出的,SI_...
int sa_flags; //表示信号的行为:SA_SIGINFO表示能接受数据 void (*sa_restorer)(void); //废弃不用了 }; //简单示例1: 用sigaction简单替换signal函数 void signalAction(int signo, siginfo_t *signalInfo, void *p) { cout << "signal = " << signo << ", desc: " << strsignal(signo) << ...
第二个参数和第三个参数都是一个sigaction结构体,其中第二个为设定新值,第一个为返回原有的设定值.该结构体定义如下: structsigaction{void(*sa_handler)(int);void(*sa_sigaction)(int,siginfo_t*,void*);sigset_t sa_mask;intsa_flags;void(*sa_restorer)(void);}; ...
siginfo_t结构: [cpp]view plaincopy The siginfo_t parameter to sa_sigaction is astructwith the following elements /* siginfo_t{ int si_signo; /* Signal number */ intsi_errno;/* An errno value */ intsi_code;/* Signal code */
void my_handler(int signo,siginfo_t *si,void *ucontext); 第一个参数: 信号编号 第二个参数:指向一个siginfo_t结构。 第三个参数是一个ucontext_t结构。 其中siginfo_t结构体中包含了大量的信号携带信息,可以看出,这个函数比sa_handler要强大,因为前者只能传递一个信号代码,而后者可以传递siginfo_t信息。
对于我们使用者来说,应该将sigset_t类型看作一个抽象的信号集合,而不需要关心其内部的具体实现细节。sigset_t类型的具体表示方式可能会因系统而异,可能是一个位图、一个数组或其他数据结构,但这些细节对于使用者来说并不重要。 我们使用者应该通过系统提供的函数来操作sigset_t变量,比如sigemptyset、sigfillset、sigadd...