首先推荐一个学Linux信息机制的博客:
https://www.cnblogs.com/hoys/archive/2012/08/19/2646377.html
强的很,通俗易懂。
可以说sigaction是signal函数的加强版,sigqueue是kill函数的加强版
实例一:信号发送及处理
实现一个信号接收程序sigreceive(其中信号安装由sigaction())
在原有的基础上添加了备注,应该可以看懂。
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
void new_op(int,siginfo_t*,void*);
main(int argc, char const *argv[])
{
struct sigaction act; //sigaction描述信号到达时的操作
int sig;
//sig=atoi(argv[1]);//atoi是把字符串转换成整型数的一个函数
sig=3;
sigemptyset(&act.sa_mask);//清空了信号集
act.sa_flags=SA_SIGINFO;//SA_SIGINFO 调用信号捕获函数
act.sa_sigaction=new_op;// new_op 指定的处理函数
if(sigaction(sig,&act,NULL) < 0)
{
printf("install sigal error\n");
}
while(1)
{
sleep(2);
printf("wait for the signal\n");
}
}
/*
由_sa_sigaction是指定的信号处理函数带有三个参数,
是为实时信号而设的(当然同样支持非实时信号),它指定一个3参数信号处理函数。
第一个参数为信号值
*/
void new_op(int signum,siginfo_t *info,void *myact)
{
printf("receive signal %d", signum);
sleep(5);
}
实例二:信号传递附加信息(利用sigqueue函数)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
void new_op(int signum,siginfo_t *info,void *myact)//三参数信号处理函数的实现
{
int i;
for(i=0;i<10;i++)
{
printf("%c\n ",(*( (char*)((*info).si_ptr)+i)));
}
printf("handle signal %d over;",signum);
}
main(int argc,char**argv)
{
struct sigaction act;
union sigval mysigval;
int i;
int sig;
pid_t pid;
char data[10];
/*
void *memset(void *str, int c, size_t n);
复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符
*/
memset(data,0,sizeof(data));//在data里填入0字符,也就是空
for(i=0;i < 5;i++)
data[i]='2';//data前五个填入2字符
mysigval.sival_ptr=data;//附加信息,要传进信号处理函数
//sig=atoi(argv[1]);
sig=3;
pid=getpid();//获取当前进程号
sigemptyset(&act.sa_mask);//清空信号集
act.sa_sigaction=new_op;//三参数信号处理函数
act.sa_flags=SA_SIGINFO;//信息传递开关,允许传说参数信息给new_op
if(sigaction(sig,&act,NULL) < 0)
{
printf("install sigal error\n");
}
while(1)
{
sleep(2);
printf("wait for the signal\n");
/*
在调用sigqueue时,sigval_t指定的信息会拷贝到
对应sig 注册的3参数信号处理函数的siginfo_t结构中,这样信号处理函数就可以处理这些信息了。
由于sigqueue系统调用支持发送带参数信号,所以比kill()系统调用的功能要灵活和强大得多
*/
sigqueue(pid,sig,mysigval);//向本进程发送信号,并传递附加信息
}
}