高级信号:相比初级信号可以携带信息
信号接收原型: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 ;
}
运行结果为: