信号注册函数sigaction

信号注册函数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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值