信号外带数据---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;
}
相关文章
|
数据安全/隐私保护 计算机视觉
使用opencv调用网络摄像头出现错误method DeSCRIBE failed
使用opencv调用网络摄像头出现错误method DeSCRIBE failed
332 0
|
6月前
|
缓存 编译器 Shell
【实战指南】 CMake搭建编译环境总结
本文总结了使用CMake搭建编译环境的技巧,涵盖单个及多个源文件的编译、CMakeLists嵌套管理、变量设置、交叉编译配置、常用编译选项及警告处理等内容。通过实例说明了如何高效组织工程结构,并利用CMake灵活控制编译流程,适用于嵌入式开发场景。
856 39
|
Java Android开发 UED
理解SurfaceFlinger在Android中的作用
理解SurfaceFlinger在Android中的作用
|
安全 编译器 C++
C++ `noexcept` 关键字的深入解析
`noexcept` 关键字在 C++ 中用于指示函数不会抛出异常,有助于编译器优化和提高程序的可靠性。它可以减少代码大小、提高执行效率,并增强程序的稳定性和可预测性。`noexcept` 还可以影响函数重载和模板特化的决策。使用时需谨慎,确保函数确实不会抛出异常,否则可能导致程序崩溃。通过合理使用 `noexcept`,开发者可以编写出更高效、更可靠的 C++ 代码。
|
搜索推荐 Linux
Linux系统编程(信号处理 sigacation函数和sigqueue函数 )
Linux系统编程(信号处理 sigacation函数和sigqueue函数 )
512 0
Linux系统编程(信号处理 sigacation函数和sigqueue函数 )
|
编解码 前端开发 JavaScript
【专栏:HTML与CSS实战项目篇】打造一个动态新闻网站
【4月更文挑战第30天】构建动态新闻网站,运用HTML和CSS提升编程技能和网页设计理解。项目包括首页、新闻列表页和详情页,设计简洁易用,包含顶部导航、轮播图和新闻列表。页面布局注重吸引力和易用性,色彩搭配选用冷色调为主,辅以亮色点缀。字体选择清晰易读,布局保持整洁。交互效果如轮播图、导航栏高亮和响应式设计增强用户体验。本文提供基础新闻网站构建指南,为进一步功能扩展和优化打下基础。
1072 5
|
算法 Unix Linux
Linux进程与信号:正常与异常的退出机制探索
Linux进程与信号:正常与异常的退出机制探索
1061 1
|
Web App开发 网络协议 Unix
客户端请求的端口号是什么?
TCP 协议里面会有两个端口,一个是浏览器监听的端口(通常是随机生成的),一个是 Web 服务器监听的端口(HTTP 默认端口号是 80, HTTPS 默认端口号是 443)。
客户端请求的端口号是什么?
|
Perl
awk的正则表达
awk的正则表达
372 6
|
存储 编译器 C语言
爱上C语言:整型和浮点型在内存中的存储(进制转换,原码,反码,补码以及大小端)
爱上C语言:整型和浮点型在内存中的存储(进制转换,原码,反码,补码以及大小端)
451 0