信号编程实战2
1高级api介绍:高级api与低级api的区别在于高级api不仅能传递信号,还能携带数据。
接受信号函数sigaction:
int sigaction(int signum, const struct sigaction *act,
struct sigaction *oldact);
发送信号函数sigqueue:
int sigqueue(pid_t pid, int sig, const union sigval value);
2具体编程实战:
接收端代码:
#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 pid=%d\n”,info->si_pid);
printf(“get data1 %d\n”,info->si_int);
printf(“get data2 %d\n”,info->si_value.sival_int);
}
}
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;
}
发送端:
#include <stdio.h>
#include <signal.h>
#include <string.h>
//int sigqueue(pid_t pid, int sig, const union sigval value);
int main(int argc,char **argv)
{
int signum;
int pid;
union sigval value;
value.sival_int=100;
signum=atoi(argv[1]);
pid=atoi(argv[2]);
sigqueue(pid,signum,value);
return 0;
}
先把接收端跑起来,默认会阻塞,再把发送端跑起来,就可以顺利接收到信号与数据了。