首页 > 系统相关 >嵌入式学习——进程间通信方式(2)—— 信号

嵌入式学习——进程间通信方式(2)—— 信号

时间:2024-09-27 16:23:39浏览次数:11  
标签:int void pid 嵌入式 间通信 信号 进程 sa sigaction

一、基本概念

什么是信号:由进程或系统发出的,用来通知发生了某个事件,希望接收方进行响应。

        信号是进程间通信机制中唯一的异步通信机制,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。正如我们所了解的中断服务函数一样,在中断发生的时候, 就会进入中断服务函数中去处理,同样的,当进程接收到一个信号的时候,也会相应地采取一些行动。

信号的特点:适合发送简单的数据,信号的数值系统是有限制的。

对信号的处理方式:

        1)对信号进行捕获处理。

        2)忽略信号,对发送来的信号不做处理(SIGKILL,SIGSTOP是不能被忽略的)。

        3)按信号的默认行为来进行处理。

可以用kill -l  查看系统中存在的信号,在Linux系统中信号33和32是不存在的,而且信号是以SIG开头的。

二、对信号的处理

        1)发送信号

              int kill(pid_t pid, int sig);     //对哪个进程发送什么类型的信号

              pid的取值说明:

                        1.pid>0 时:发送信号给指定的进程。
                        2.pid=0 时:信号发送到和当前进程在同一进程组的进程。
                        3.pid=-1时:发送到系统中所有的进程,进程1 (init) 除外。
                        4.pid<-1时:将信号sig发送给进程组号为-pid (pid绝对值)的每一个进程。

              sig:要发送的信号类型(上面的62种)。

             ② int sigqueue(pid_t pid, int sig, const union sigval value);  //当发送信号,需要携带数据时

                sigval是一个联合体,

                union sigval {
                                       int   sival_int;
                                       void *sival_ptr;
                                   };

                这个联合体可以存放你所需要的数据。
             ③int raise(int sig);           //发送信号给本进程

             ④unsigned int alarm(unsigned int seconds);  //在进程中设置一个定时器  也称为闹钟函数

                在设置多个定时器时,后面的定时器会覆盖前一个的时间。它的返回值是之前闹钟的剩余秒数,如果之前未设闹钟则返回0。 特别地,如果新的seconds为0,则之前设置的闹钟会被取消,并将剩下的时间返回。

        2)捕获信号

             ①sighandler_t signal(int signum, sighandler_t handler);   

                signum:要捕获的信号类型

                handler:对信号处理的响应函数

             ②int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);

                struct sigaction {
                                               void     (*sa_handler)(int);
                                               void     (*sa_sigaction)(int, siginfo_t *, void *);
                                               sigset_t   sa_mask;
                                               int        sa_flags;
                                               void     (*sa_restorer)(void);
                                           };

                sa_handler:是一个函数指针,传入int类型参数,返回值是void,就和signal的信号处理函数一样。

                sa_sigaction则是扩展信号处理函数

                sa_mask:设置阻塞或非阻塞模式,使用SA_NODEFER标志,不阻塞。

                sa_flags:修改信号处理过程行为的标志

        3)阻塞信号

              int pause(void);

举例,拿闹钟函数,和捕获信号处理

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
void handler(int sig)
{
    if(sig == SIGALRM)
    {   
        printf("你制定的信号时间到了!\n");
        printf("----------------------\n");
    }                                                                                                                                                                                                         
}
int main()
{
        //设置一个alarm定时器
        unsigned int ret;
        ret = alarm(5);

        //对alarm信号做一个捕获  利用sigaction()
        struct sigaction act;        //定一个sigaction的结构体变量
    
        act.sa_handler = handler;   //利用sa_handler来接收处理信号的函数

        sigemptyset(&act.sa_mask);   //信号处理时不会屏蔽其他信号

        act.sa_flags = SA_RESETHAND;  //处理完一次后,恢复该信号的默认处理模式

    
        sigaction(SIGALRM,&act,NULL); 

        sleep(6);

        printf("end\n");

        return 0;


}

标签:int,void,pid,嵌入式,间通信,信号,进程,sa,sigaction
From: https://blog.csdn.net/weixin_46432503/article/details/142572189

相关文章

  • PARTV-Oracle实例架构-进程架构
    15.进程架构15.1.进程简介进程是操作系统中可以运行一系列步骤的机制。这个机制取决于操作系统。例如,在Linux上,Oracle后台进程是一个Linux进程。在Windows上,Oracle后台进程是进程内的执行线程。代码模块由进程运行。所有连接到Oracle数据库的用户都必须运行以下模块......
  • 新手答疑 | 零基础该怎么学习嵌入式?嵌入式Linux学习路线是什么?嵌入式开发板推荐?
    很多初学者想要涉足嵌入式Linux开发领域,但往往在刚入门阶段,会因为初次接触到大量复杂的概念术语和深奥的技术文档感到压力重重,面对这些内容不知从何下手,感到十分迷茫,网上的内容也纷繁复杂,没有清晰的学习线路,看完后甚至更蒙圈。实际上,嵌入式Linux开发并没有想象中的那样高不可攀,关键......
  • 嵌入式常用硬件电路设计及分析 — 通信篇
    目录一、简介二、RS232通信1、硬件电路设计2、硬件电路设计分析(1)常规电路(2)EMC设计使用注意事项3、DB9接头定义三、RS485通信1、硬件电路设计2、硬件电路设计分析(1)自动收发电路(2)上下拉电阻注意事项(3)TVS管作用(4)末端匹配电阻作用四、USB转串口(1)常规电路设计(2)ISP......
  • 51c嵌入式~电路~合集6
    一、单片机中用二极管实现不同电压的输出用二极管的单向导电性可以设计出好玩、实用的电路。    分享本文,分析限幅电路和钳位电路,是如何用二极管来实现的。限幅电路VIN大于等于0.7V,二极管正向导通。此时,VOUT会被钳位在0.7V上。    而当VIN小于0.7V时二极管是截止状态,在负半......
  • 利用Python开发Exporter,集成Prometheus和Grafana对进程监控
    利用Python开发Exporter,集成Prometheus和Grafana对进程监控在现代软件开发和运维中,监控是确保系统稳定运行和快速响应问题的重要手段。Prometheus和Grafana的组合是监控领域的强大工具,它们能够收集、处理和展示各种指标数据。本文将介绍如何利用Python开发一个Exporter,通过Promet......
  • 嵌入式项目:STM32平衡车详解 (基础知识篇) (基于STM32F103C8T6)
    前言:本文是基于B站草履虫编写的平衡车相关内容,包括模块和基础知识,结合代码进行讲解,将知识进行汇总(由于本篇内容较长,请结合目录使用)注:基于开源精神,本文仅供学习参考目录前言:本文是基于B站草履虫编写的平衡车相关内容,包括模块和基础知识,结合代码进行讲解,将知识进行汇总......
  • 进程的基本
    1.冯诺依曼体系结构我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系结构截至目前为止,我们所认识的计算机,都是由一个个硬件组件组成的:输入单元:包括键盘,鼠标,扫描仪,写板等中央处理器(CPU):含有运算器和控制器等输出单元:显示器,打印机等关于......
  • .esd 文件通常由微软安装程序创建,如果你需要转换 .wim 文件,可以使用 DISM 工具进
    使用PowerShell备份和还原系统的.wim文件可以通过以下步骤完成。.wim文件是Windows映像格式,用于存储操作系统的完整映像。备份系统到 .wim 文件打开PowerShell以管理员身份运行:在开始菜单中搜索“PowerShell”,右键点击并选择“以管理员身份运行”。使用DIS......
  • 【项目案例】嵌入式Linux比较好的10+练手项目推荐,附项目文档/源码/视频
    后台私信小雯老师,回复“嵌入式Linux项目”,免费获取以下所有项目配套源码及文档。练手项目推荐 1 智能猫眼项目功能介绍:1.人脸识别:基于百度专业的深度学习算法和海量数据训练可进行人脸识别,轻松知晓访客身份;2.智能报警:实时检测非法闯入,可以自动布防,当触发警报时实时报警,最短时间......
  • python 递归锁、信号量、事件、线程队列、进程池和线程池、回调函数、定时器
    一、python线程死锁与递归锁死锁现象所谓死锁:是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程代码示例:fromthreadingimport......