int sa_flags; //指定对信号进行处理的选项,这里主要使用两个,见下表 void (*sa_restorer) (void); } SA_ONSTACK选项的作用是指定信号处理程序在一个新的栈上面去运行,如果直接在原有的栈上面运行有可能会破话现场,而且旧的栈可能已经遭到破坏而不能使用。 SA_SIGINFO的作用则是让内核在发送信号的时候要捎...
如果几个定时器产生了同一个信号,处理程序可以用 sigev_value来区分是哪个定时器产生了信号。要实现这种功能,程序必须在为信号安装处理程序时,使用struct sigaction的成员sa_flags中的标志符SA_SIGINFO。 sigev_notify的值可取以下几种: SIGEV_NONE:定时器到期后什么都不做,只提供通过timer_gettime和timer_getoverrun查...
SA_NOCLDWAIT:使父进程在它的子进程退出时不会收到SIGCHLD信号,这时子进程如果退出也不会成为僵 尸进程。 SA_NODEFER:使对信号的屏蔽无效,即在信号处理函数执行期间仍能发出这个信号。 SA_RESETHAND:信号处理之后重新设置为默认的处理方式。 SA_SIGINFO:使用sa_sigaction成员而不是sa_handler作为信号处理函数。 函数...
sighandler_thandler);intsigaction(intsignum,conststructsigaction*act,structsigaction*oldact);Thesigactionstructureisdefinedassomethinglike:structsigaction{void(*sa_handler)(int);void(*sa_sigaction)(int,siginfo_t*,void*);sigset_tsa_mask;intsa_flags;void(*sa_restorer)(void...
–SA_SIGINFO:使用sa_sigaction作为信号处理函数 –SA_NODEFER:在执行信号处理函数时,不阻塞当前信号 –SA_RESETHAND:当用户注册的信号处理函数被执行过一次后,该信号的处理函数被设为系统默认的处理函数 –SA_RESTATR:由此信号中断的系统调用会自动重启
sa_sigaction:当sa_flags被指定为SA_SIGINFO标志时,使用该信号处理程序。(很少使用) 重点掌握: ① sa_handler:指定信号捕捉后的处理函数名(即注册函数)。也可赋值为SIG_IGN表忽略 或 SIG_DFL表执行默认动作 ② sa_mask: 调用信号处理函数时,所要屏蔽的信号集合(信号屏蔽字)。注意:仅在处理函数被调用期间屏蔽生...
如果接收进程使用 sigaction(2) 的 SA_SIGINFO 标志为这个信号建立一个处理程序,那么它可以通过作为第二个参数传递给处理程序的 siginfo_t 结构的 si_value 字段获得这个数据。 此外,该结构体的 si_pid 和 si_uid 字段可用于获取发送信号的进程的 PID 和真实用户 ID。
SA_SIGINFO:表示使用sa_sigaction字段指定的信号处理函数。(我们一般设置为0就行了) void (*sa_restorer)(void):这是一个保留字段,已经废弃,不再使用。 返回值为0表示函数调用成功,返回-1表示函数调用失败。在函数调用失败的情况下,可以通过errno全局变量获取具体的错误信息。
为了正确设置进程的用户态栈,handle_signal函数既可以调用setup_frame(对于那些不需要siginfo_t的信号),也可以调用setup_rt_frame(对于那些确定需要siginfo_t的信号)。具体调用哪个函数,依赖于信号的sigaction表中sa_flags字段的SA_SIGINFO标志。 接下来,我们看一下setup_frame函数的具体实现:(Linux内核版本是v2.6.11,...
sa_sigaction需要配合SA_SIGINFO一起使用,如果设置了SA_SIGINFO,则信号处理函数将由sa_sigaction代替sa_handler,二者只能赋值其一,否则会以最后一次赋值为准 sa_restorer:已经被废弃,不再使用。 sa_mask 用来设置在处理该信号时暂时将sa_mask 指定的信号集搁置 ...