信号注册函数sigaction
2017-02-14 20:09
267 查看
信号注册函数sigaction
sigaction与signal的区别
同样是信号注册处理函数,可以说sigaction是signal的加强版本.sigaction的优势:1.可以通过信号携带附加信息,配合sigqueue函数使用
2.可以设置信号处理函数时的使用的信号集掩码,sa_mask
3.另外额外功能在 sa_flag中说明
函数说明
int sigaction(int signum,const struct sigaction *act ,struct sigaction *oldact) struct sigaction { void (*sa_handler)(int); /*信号回调函数*/ void (*sa_sigaction)(int, siginfo_t *, void *); /*信号回调函数加强*/ sigset_t sa_mask; /*在执行回调函数的信号掩码*/ int sa_flags; /*标志位*/ void (*sa_restorer)(void); }; 结构体说明: 1.void (*sa_sigaction)(int, siginfo_t *, void *); siginfo_t {//信号传递过来的额外信息 sigval_t si_value; /* Signal value */ int si_int; /* POSIX.1b signal */ ...//还有很多 } 2.sa_flags:用来设置信号处理的其他相关操作,下列的数值可用。可用OR 运算(|)组合 A_NOCLDSTOP:如果参数signum为SIGCHLD,则当子进程暂停时并不会通知父进程 SA_ONESHOT/SA_RESETHAND:表示信号处理一旦被调用过,就恢复到默认处理函数 SA_RESTART:被信号中断的系统调用会自行重启,默认打断,如read(),getchar() (signal函数默认重启了) ŸSA_NOMASK/SA_NODEFER:在处理此信号未结束前不理会此信号的再次到来 SA_SIGINFO:信号处理函数是带有三个参数的sa_sigaction (配合sigqueue函数使用) int sigqueue(pid_t pid, int sig, const union sigval value); pid:对应进程 sig:信号 value:信号携带的附加信息 union sigval { int sival_int; void *sival_ptr; };
函数示例
示例说明:1.验证sa_flags:SA_RESTART
2.信号携带参数
#include <signal.h> #include <stdio.h> #include <errno.h> // 新的信号处理函数 void handle(int v, siginfo_t* info, void* p) { printf("recv SIGINT,arg=%d\n",info->si_int); } int main() { // 默认的signal已经有SA_RESTART这个flag了 //signal(SIGINT, handle); struct sigaction sig; sig.sa_handler = NULL; sig.sa_sigaction = handle; sigemptyset(&sig.sa_mask); // sig.sa_flags = 0; sig.sa_flags = SA_RESTART; // 让阻塞的系统调用,被这个信号打断之后,要重启 sig.sa_restorer = NULL; // 在Linux下没用,直接填NULL就可以了 sigaction(SIGINT, &sig, NULL); union sigval v; v.sival_int=99;//信号携带参数 sigqueue(getpid(),SIGINT,V);//发送携带额外参数的信号。 char buf[1024]; int ret = read(0, buf, sizeof(buf)); // read被中断打断了 printf("ret = %d, errno=%d, EINTR=%d\n", ret, errno, EINTR); // EINTR }
相关文章推荐
- siganl与sigaction注册信号处理函数的区别
- 信号处理函数(3)-sigaction() 为信号注册信号捕捉函数
- 41-新的信号注册函数 sigaction
- LINUX信号-sigaction更强壮的信号注册函数
- linux系统编程之信号(六):信号发送函数sigqueue和信号安装函数sigaction
- Linux信号signal介绍,signal()函数,sigaction()函数
- 对信号注册函数signal的理解1
- linux信号机制之sigaction结构体浅析,signal 函数,信号捕捉
- linux信号机制之sigaction 浅析,signal 函数,信号捕捉 信号编码意义
- 《unix环境高级编程》信号——sigaction 函数
- siginalExample.c(使用signal和sigaction函数捕捉和处理信号)
- linux信号机制之sigaction结构体浅析,signal 函数,信号捕捉
- 信号相关函数(signal,sigaction,sigprocmask, kill,sigqueue信号发送函数,睡眠函数,计时器函数)
- 2信号处理之:信号产生原因,进程处理信号行为,信号集处理函数,PCB的信号集,sigprocmask()和sigpending(),信号捕捉设定,sigaction,C标准库信号处理函数,可重入函数,
- UNIX环境编程学习笔记(25)——信号处理进阶学习之 sigaction 函数
- linux 信号的捕捉和发送函数的简单使用:sigaction()和sigqueue()
- signal---高级信号注册函数
- linux信号处理、killall、SIGALRM、sigaction函数和结构体、向进程发送信号
- linux信号机制之sigaction结构体浅析,signal 函数,信号捕捉
- linux信号之sigaction结构体 signal 函数