本节只有代码演示和讲解。演示如何利用信号来实现数据的传递,不过在《Linux C编程实战》笔记:信号的发送-CSDN博客我已经演示过使用sigqueue发送数据了。本节是书上使用sigqueue发送数据的例子。
那么直接看代码吧,首先是发送方的程序
//选项-d后跟待传递的数据,选项-s后跟待发送的信号,选项-p后跟目的进程ID
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<signal.h>
#include<unistd.h>
int main(int argc,char **argv){
sigval_t value;
//union sigval value;这两种等价,是一个数据类型
int signum=SIGTERM;
pid_t pid;
int i;
//初始化
value.sival_int=0;
//检查参数个数
if(argc!=3&&argc!=5&&argc!=7){
printf("./send_data_signo<-d data><-s signum>[-p][data]\n");
exit(1);
}
//从参数中解析出信号编号,pid和传递的数据
for(i=1;i<argc;i++){
if(!strcmp(argv[i],"-d")){
value.sival_int=atoi(argv[i+1]);//传递的数据在-d之后
continue;
}
if(!strcmp(argv[i],"-s")){
signum=atoi(argv[i+1]);//信号在-s之后
continue;
}
if(!strcmp(argv[i],"-p")){
pid=atoi(argv[i+1]);//pid在-p之后
continue;
}
}
//利用sigqueue给pid发送信号signum,并携带数据value
if(sigqueue(pid,signum,value)<0){
perror("sigqueue");
exit(1);
}
return 0;
}
然后是接收方的程序
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<signal.h>
#include<unistd.h>
void handler_sigint(int signo,siginfo_t *siginfo,void *pvoid){
//打印数据
printf("recv SIGINT,the data value is :%d\n",siginfo->si_int);//改成siginfo->si_value.sival_int也是可以的
}
int main(int argc,char **argv){
//设置一下sigaction
struct sigaction act;
act.sa_sigaction=handler_sigint;
act.sa_flags=SA_SIGINFO;
sigaction(SIGINT,&act,nullptr);
while(1);
return 0;
}
运行结果: