信号注册函数sigaction

来源:互联网 发布:咏春拳可以自学吗 知乎 编辑:程序博客网 时间:2024/04/30 06:10

信号注册函数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}
0 0
原创粉丝点击