您的位置:首页 > 其它

信号注册函数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
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐