信号外带数据---sigaction()函数和sigqueue()函数的使用

简介: 信号外带数据---sigaction()函数和sigqueue()函数的使用

sigaction:接收、捕捉(预设值接收)

这个结构体的中sa_flag要设置为:SA_SIGINFO,才能使用使用拓展信号响应函数

标准信号响应函数:typedef void (*sighandler_t)(int);

拓展信号响应函数:void (*sa_sigaction)(int, siginfo_t *, void *);

sa_sigaction赋值为你要的信号响应函数的地址

sigqueue(发送)

该函数的第三个参数:联合体分析(不难推出,这个联合体就是存放你要外带的数据)

代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>

void Sig_Task(int sig_num, siginfo_t *data_p, void *p);
void Sig_Task(int sig_num, siginfo_t *data_p, void *p)
{
    //外带的数据要在信号响应函数内打印
    printf("信号值%d---外带数据%s\n", sig_num, (char *)data_p->si_ptr);
}

int main()
{
    struct sigaction act;
    memset(&act, 0, sizeof(act));
    act.sa_flags = SA_SIGINFO;   //设置拓展为信号响应函数
    act.sa_sigaction = Sig_Task; //指定进程的拓展信号响应函数
    int sig_ret = sigaction(SIGUSR1, &act, NULL);
    if (sig_ret == -1)
    {
        perror("sigaction");
        exit(-1);
    }
    else
    {
        printf("外带数据预设值成功!\n");
    }


    union sigval value;
    value.sival_ptr  = malloc(sizeof(char) * 20);
    if (value.sival_ptr == NULL)
    {
        perror("malloc");
        exit(-1);
    }
    strcpy(value.sival_ptr, "Hello world!");

    //sigqueue(给谁发<进程号>,发什么(信号值),外带什么数据<联合体>);
    int sigqueue_ret = sigqueue(getpid(), SIGUSR1, value);
    if (sigqueue_ret == -1)
    {
        perror("sigqueue");
        exit(-1);
    }
    else 
    {
        printf("外带数据信号发送成功!\n");
    }
    while(1)
    {
        sleep(1);
    }
    return 0;
}
相关文章
|
4月前
QT自定义信号,信号emit,信号参数注册
使用signals声明返回值是void在需要发送信号的地方使用emit 信号名字(参数)进行发送在需要链接的地方使用connect进行链接ct进行链接。
44 0
QT自定义信号,信号emit,信号参数注册
|
4月前
|
Unix
网络编程之 信号捕捉器(函数指针与回调函数)(2)
sigaction()函数 前面我们讲到的内容已经足以用来防止僵尸进程生成的代码。之所以博主还要介绍sigaction()函数是因为它类似于signal()函数,而且完全可以代替后者,也更稳定(主要是书上介绍到了
57 1
|
4月前
|
Linux
网络编程之 信号捕捉器(函数指针与回调函数)(1)
接着我们的信号说下去 之前博主给大家分享到了信号的概念和初步介绍signal函数的形式后就没有继续往下介绍了,实在是因为时间不够,那个时候博主还要上课,现在博主放假了就好好给大家分享一下如何注册信号捕捉,以及信号捕捉器的妙用。
60 1
|
10月前
|
设计模式 Unix Shell
ECF机制:信号 (Signal)
ECF机制:信号 (Signal)
152 0
|
消息中间件 Unix Linux
进程通信 软中断 signal()解读
进程通信 软中断 signal()解读
|
4月前
|
存储 安全 Linux
【探索Linux】P.18(进程信号 —— 信号捕捉 | 信号处理 | sigaction() )
【探索Linux】P.18(进程信号 —— 信号捕捉 | 信号处理 | sigaction() )
94 0
|
Unix Linux
Linux系统应用编程 --- 信号处理函数(sigaction实现信号捕捉设定)
Linux系统应用编程 --- 信号处理函数(sigaction实现信号捕捉设定)
107 0
【STM32】USART串口重映射 & 打印输出printf标识符
【STM32】USART串口重映射 & 打印输出printf标识符
224 0
|
Linux
【Linux信号专题】三、未决信号集、阻塞信号集与信号集操作函数
【Linux信号专题】三、未决信号集、阻塞信号集与信号集操作函数
343 0
【Linux信号专题】三、未决信号集、阻塞信号集与信号集操作函数
|
物联网 Linux 开发者
signal 函数1|学习笔记
快速学习 signal 函数1
signal 函数1|学习笔记