2021-06-19

高级信号:相比初级信号可以携带信息
信号接收原型:int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
第一个参数signum应该就是注册的信号的编号;第二个参数act如果不为空说明需要对该信号有新的配置;第三个参数oldact如果不为空,那么可以对之前的信号配置进行备份,以方便之后进行恢复。

struct sigaction {
void (*sa_handler)(int); //信号处理程序,不接受额外数据,SIG_IGN 为忽略,SIG_DFL 为默认动作
void (*sa_sigaction)(int, siginfo_t *, void *); //信号处理程序,能够接受额外数据和sigqueue配合使用
sigset_t sa_mask;//阻塞关键字的信号集,可以再调用捕捉函数之前,把信号添加到信号阻塞字,信号捕捉函数返回之前恢复为原先的值。
int sa_flags;//影响信号的行为SA_SIGINFO表示能够接受数据
};

关于void (*sa_sigaction)(int, siginfo_t , void );处理函数来说还需要有一些说明。void 是接收到信号所携带的额外数据;而struct siginfo这个结构体主要适用于记录接收信号的一些相关信息。
siginfo_t {
int si_signo; /
Signal number /
int si_errno; /
An errno value /
int si_code; /
Signal code /
int si_trapno; /
Trap number that caused
hardware-generated signal
(unused on most architectures) /
pid_t si_pid; /
Sending process ID /
uid_t si_uid; /
Real user ID of sending process /
int si_status; /
Exit value or signal /
clock_t si_utime; /
User time consumed /
clock_t si_stime; /
System time consumed /
sigval_t si_value; /
Signal value /
int si_int; /
POSIX.1b signal */
void si_ptr; / POSIX.1b signal /
int si_overrun; /
Timer overrun count; POSIX.1b timers /
int si_timerid; /
Timer ID; POSIX.1b timers */
void si_addr; / Memory location which caused fault /
int si_band; /
Band event /
int si_fd; /
File descriptor */
}

信号获取:
#include<stdio.h>
#include<signal.h>

void handler(int signum,siginfo_t *info, void *context)
{
printf(“get signum %d\n”,signum);

    if(context != NULL){
            printf("get data=%d\n",info->si_int);
            printf("get data=%d\n",info->si_value.sival_int);
            printf("form:%d\n",info->si_pid);  //获取发送端pid

    }

}
int main()
{
struct sigaction act;
printf(“pid = %d\n”,getpid());

    act.sa_sigaction = handler;   //对第二个参数的配置
    act.sa_flags = SA_SIGINFO;


    sigaction(SIGUSR1,&act,NULL);    
    while(1);
    return 0;

}

发送信号:
原型:int sigqueue(pid_t pid, int sig, const union sigval value);
union sigval {
int sival_int;
void *sival_ptr;
};

#include<stdio.h>
#include<signal.h>
int main(int argc,char **argv)
{
int signum;
int pid;

    signum = atoi(argv[1]);    //将ask码转换为数字
    pid = atoi(argv[2]);


    union sigval value;  
    value.sival_int = 100;

    sigqueue(pid,signum,value);
    printf("%d done\n",getpid());
    return 0 ;

}

运行结果为:在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值