《Linux C编程实战》笔记:信号的发送与处理实例

本文详细介绍了如何在C语言中使用`sigqueue`函数,通过`SIGTERM`信号向目标进程传递整数值,同时给出了发送方和接收方的代码示例。
摘要由CSDN通过智能技术生成

本节只有代码演示和讲解。演示如何利用信号来实现数据的传递,不过在《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;
}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值