首先是信号注册的实例
#include <stdio.h>
#include <stdlib.h>
#include "signal.h"
#include "sys/types.h"
#include "unistd.h"
void my_action(int signum, siginfo_t * info, void * myact)
{
//信号的响应操作
printf("recive signal %d\n", signum);
//打印sigval的参数
printf("int parmer %d\n", info->si_int);
}
void CreateSigAndBind(int Sig,void (*fun)(int signum, siginfo_t * info, void * myact))
{
struct sigaction act; //创建新的信号
struct sigaction old_act; //用与记录旧的信号,当然你也可以不用记录
sigemptyset(&act.sa_mask);
act.sa_flags = SA_SIGINFO;
act.sa_sigaction = fun; //设置信号的响应操作
if(sigaction(Sig, &act, &old_act) < 0) { //开始创建信号
printf("install sigal error\n");
return ;
}
}
int main(int argc, char**argv)
{
CreateSigAndBind(13,&my_action);
CreateSigAndBind(44,&my_action);
while(1) { //为了测试写的一个死循环
sleep(2);
printf("Now we wait for signal\n");
}
return 1 ;
}
然后是发送信号的实例
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MYSIG 13
int main(int argc, char ** argv)
{
pid_t pid = (pid_t)atoi(argv[1]);
//发送的信号值
int signo = MYSIG;
//附带在信号上的参数
union sigval mysigval;
mysigval.sival_int = 8;
//sigval支持也 void *sival_ptr;
//发送信号
if(sigqueue(pid, signo, mysigval)==-1)
{
printf("send signal fail\n");
return -1;
}
printf("send signal success\n");
sleep(2);
}
几个重要说明
传参需要用到的sigval结构体
union sigval {
int sival_int;
void *sival_ptr;
};
常用的用户自定义信号
10.SIGUSR1 12.SIGUSR2 34-64.SIGRTMIN - SIGRTMAX
例如,原子操作。