嵌入式学习(Day:28 进程间通信2 -> 信号通信)

进程间通信 ===》信号通信

1. 64个信号
    应用:异步通信。 中断,,        (PCBC块中,64个信号,大部分是:关闭,暂停,继续)
linux@ubuntu:~$ kill -l        (9/19带有强制性,其余具有滞后性,可能稍滞后)
 1) SIGHUP     2) SIGINT(关闭:类似于ctrl c)     3) SIGQUIT     4) SIGILL     5) SIGTRAP   (ring 0 ,ring 3)
 6) SIGABRT(系统触发错误) 7) SIGBUS(总线错误)     8) SIGFPE(算数错误) 9) SIGKILL(重点:强制关闭)10) SIGUSR1(用户自定义)
11) SIGSEGV(重点:段错误信号)    12) SIGUSR2(用户自定义)13) SIGPIPE(重点:管道破裂)14) SIGALRM(重点:定时器,闹钟)15) SIGTERM(非强制关闭,kill的默认信号,可等紧急事件处理完后再关闭)
16) SIGSTKFLT    17) SIGCHLD(子进程消亡,给父进程发此信号。默认忽略)18) SIGCONT(继续)19) SIGSTOP(重点:强制暂停)    20) SIGTSTP(暂停).................

    1~64;32应用编程。
    如何响应:
     Term   Default action is to terminate the process.    (关闭)

       Ign    Default action is to ignore the signal.    (忽略:允许别人给我发,但不做响应)
       wait

       Core   Default action is to  terminate  the  process  and  dump  core  (see
              core(5)).            (内存转储:和Term类似,关闭生成一个core文件)
        gdb a.out -c core    (gdb直接停在出错位置)
       Stop   Default action is to stop the process.

       Cont   Default  action  is  to  continue  the  process  if  it is currently
              stopped.

    2. 信号的传递过程
    kill      -xx     xxxx
    发送进程  信号    接收进程
    kill -9 1000
    a.out  9 1000
            2.1   发送端
    #include <sys/types.h>
    #include <signal.h>

    int kill(pid_t pid, int sig);    (给别人或自己发)
    功能:通过该函数可以给pid进程发送信号为sig的系统信号。
    参数:pid 要接收信号的进程pid
          sig 当前程序要发送的信号编号 《=== kill  -l
    返回值:成功 0
            失败  -1;

    int raise(int sig)== kill(getpid(),int sig);    (给自己发)
    功能:给进程自己发送sig信号

    unsigned int alarm(unsigned int seconds);SIGALAM     alarm(5);   定时5秒后关闭
    功能:定时,由系统给当前进程发送信号,默认功能为关闭a.out(调用alarm的进程)      类似于单片机中的中断;
          也称为闹钟函数        (返回值:上一次闹钟还有多久到达,不常用)

          闹钟只有一个,定时只有一次有效,
          但是必须根据代码逻辑是否执行判断。
    int pause(void);
    功能:进程暂停,不再继续执行,除非收到其他信号。(信号:需要捕获才管用,直接调用kill无效)    (调用后,默认为暂停功能)
            (捕获CONTN后,pause()跳过,程序被唤醒继续执行)用3号退出pause状态也行
                     信号  kill  -l  ==>前32个有具体含义的信号
           2.2  接收端
        每个进程都会对信号作出默认响应,但不是唯一响应。
        一般如下三种处理方式:
        1、默认处理
        2、忽略处理     (9,19,除外)
        3、自定义处理 (也叫信号的捕获)    (9,19不能被忽略和自定义, 捕获)

        以上三种方式的处理需要在如下函数上实现。

    信号注册函数原型:
     void ( *signal(int signum, void (*handler)(int)) ) (int);  (参数1:信号数或者信号名;参数2:要调用的函数名)
     typedef void (*sighandler_t)(int);
     ===》void (*xx)(int); == void fun(int);
     ===》xx是 void fun(int) 类型函数的函数指针
     ===》typedef void(*xx)(int)   sighandler_t; ///错误
          typedef int   myint;

     ===>sighandler_t signal(int signum, sighandler_t handler);
     ===> signal(int sig, sighandler_t fun);
     ===> signal(int sig, xxx fun);
     ===>fun 有三个宏表示:(SIG_DFL 表示收到信号,恢复默认处理;SIG_IGN 表示:收到信号,忽略处理; fun 表示自定义处理)

    结论: 9  19 不能被忽略也不能被自定义
            自定义信号处理:
            1、必须事先定义自定义函数,必须是如下格式:
        void fun(int sig)  sig 接收到的信息编号            (fun:定义的函数名;sig:信号编号或信号名)
        {

         }

            2、在所有的信号中有如下两个特列:
        10 SIGUSR1
        12 SIGUSR2
        专门预留给程序员使用的未定义信号。

3.共享内存(SHM)

        shm,sem,msg

    system v :  共享内存(shm)  信号量集(sem)    消息队列(msg),发消息时,给消息设置等级,后发的可能先读,其余与管道类似

    IPC对象操作通用框架:
    0x  ftok
    key值 ==> 申请 ==》读写 ==》关闭 ==》卸载
    key值:===》唯一键值
    创建方式有三种:

    1、IPC_PRIVATE 固定的私有键值,其值等于 0x0
        一般用于有亲缘关系的进程间使用。

    2、ftok()创建临时键值。
    #include <sys/types.h>
    #include <sys/ipc.h>
                "/etc"                        '!'
    key_t ftok(const char *pathname, int proj_id);       (ftok:申请K值)
    功能:通过该函数可以将pathname指定的路径用来以
          proj_id生成唯一的临时键值。
    参数:pathname 路径+名称===》任意文件,只要不会
          被删除重建即可。
          proj_id  整形的数字,一般用ASCII码的单字符    (如:!)
          表示与参数1的运算。

    返回值:成功 返回唯一键值
            失败  -1;
    3.共享内存相关的命令行命令:
            1.  ipcs -a 查询共享内存,信号量集,消息队列
            2.  ipcrm -s 删除信号量集
          -m 删除共享内存  (用Id删除,M:)
    共享内存 ===》效率最高的进程间通信方式

    4.共享内存的操作流程:
     key ==》申请对象 ==》映射对象==》读写对象
         ==》撤销映射 ==》删除对象

         4.1 申请对象:shmget()
    #include <sys/ipc.h>
    #include <sys/shm.h>
    ps aux|grep a.out
        share memory get                 IPC_CREAT|0666
    int shmget(key_t key, size_t size, int shmflg);
    功能:使用唯一键值key向内核提出共享内存使用申请
    参数:key  唯一键值
          size  要申请的共享内存大小    (size大小,是页大小(4K)的整数倍)
          shmflg 申请的共享内存访问权限,八进制表示
          如果是第一个申请,则用IPC_CREAT
          如果要检测是否存在,用IPC_EXCL
    返回值:成功 返回共享内存id,一般用shmid表示
            失败  -1;

            share memory attach
           4.2   映射对象:shmat()
    void *shmat(int shmid, const void *shmaddr, int shmflg);
    功能:将指定shmid对应的共享内存映射到本地内存。
    参数:shmid 要映射的本地内存
          shmaddr 本地可用的地址,如果不确定则用NULL,表示
                  由系统自动分配。
          shmflg  
          0,表示读写
          SHM_RDONLY,只读
    返回值:成功 返回映射的地址,一般等于shmaddr
            失败 (void*)-1     (不是NULL,NULL是(void*)0)
        4.3 读写共享内存:类似堆区内存的直接读写:
    char * p ;
    write(fd,p,);
    read(fd,p,1024);
    memcpy(p,buf,1024);strcpy();
    memset(p,0,1024);== bzero(p,1024);
    memcmp(p,buf,1024); strcmp(a,b);
     
    字符串:     strcpy(p,"hello");
    字符/数字: 直接赋值

            1、共享内存数据的存储方式是拷贝还是剪切? 拷贝

            2、共享内存的数据如果多次不同进程读写会怎么样?
                同一操作对象,数据没有偏移情况下会覆盖。

          4.4 撤销映射:shmdt    (断开关联关系)
    int shmdt(const void *shmaddr);
    功能:将本地内存与共享内存断开映射关系。
    参数:shmaddr 要断开的映射地址。
    返回值:成功  0
            失败  -1;
           4.5 删除对象:shmctl  (删除共享内存段)
    int shmctl(int shmid, int cmd, struct shmid_ds *buf);
    功能:修改共享内存属性,也可以删除指定的共享内存对象。
    参数:shmid 要删除的共享内存对象
          cmd IPC_RMID 删除对象的宏 
          buff NULL 表示只删除对象。
    返回值:成功 0
            失败 -1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/18382.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

防御恶意爬虫攻击

数据抓取爬虫 数据抓取爬虫是攻击者使用自动化脚本或工具在移动应用程序中抓取敏感数据的一种方式。这些爬虫可以定向抓取用户信息、产品列表、评论和评级等数据。攻击者可能会将这些数据用于非法目的&#xff0c;例如进行身份盗窃、诈骗活动或者卖给其他恶意方。 对于移动应用…

[机缘参悟-192] - 《道家-水木然人间清醒1》读书笔记 -15- 关系界限 - IT互联网时代下的真爱的形态

目录 前言&#xff1a; 1、 既独立又结盟&#xff0c;才是最好的关系 2、世间所有的好关系&#xff0c;一定要先谈钱 3、怎么建立高品质的关系 4、恋爱是情感组合&#xff0c;婚姻是价值组合 5、什么是成熟的爱情 6、婚姻的难点 7、这个时代稀缺的女性特质 8、恋爱和婚…

YD/T 2698-2014 《电信网和互联网安全防护基线配置要求及检测要求 网络设备》标准介绍

编写背景 随着互联网技术的飞速发展&#xff0c;网络设备的安全问题日益凸显。为了加强电信网和互联网的安全防护&#xff0c;保障网络环境的稳定和用户信息的安全&#xff0c;YD/T 2698-2014标准应运而生。此标准旨在为网络设备提供一套基线配置要求&#xff0c;以及相应的安…

pytorch要点和难点具体应用案例

PyTorch是一个开源的Python机器学习库&#xff0c;由Facebook人工智能研究院&#xff08;FAIR&#xff09;开发并维护。它基于 Torch&#xff0c;是一个为深度学习而设计的动态图计算框架&#xff0c;特别适用于自然语言处理&#xff08;NLP&#xff09;等应用。 PyTorch的主要…

Docker-02-02 Docker离线下载安装与配置(linux)

一、Docker下载 官网下载地址:Index of linux/static/stable/x86_64/ (docker.com) 推荐下载最新的社区版: 二、将安装包上传至服务器并解压 将安装包上传至服务器的/usr/local目录并解压 cd /usr/local lstar -zxvf docker-18.06.3-ce.tgz三、将docker目录下的文件复制到…

ubuntu server 24.04 (Linux) 源码编译安装 OpenResty 1.25.3.1 Released

1 下载: OpenResty - 开源官方站 2 通过xftp等方式上传到ubuntu服务器 3 安装 #解压 tar zxvf openresty-1.25.3.1.tar.gz #创建运行用户 sudo groupadd www sudo useradd -g www www -s /bin/false #安装依赖软件 sudo apt update sudo apt-get install libpcre3-dev l…

OSINT 与心理学:通过开源情报进行剖析和行为分析

在不断发展的心理学领域&#xff0c;人们越来越认识到通过应用开源情报 (OSINT) 方法取得进步的潜力。OSINT 主要以其在安全和情报领域的应用而闻名&#xff0c;并且越来越多地展示其在心理分析和行为分析方面的潜力。本文探讨了 OSINT 和心理学的迷人交叉点&#xff0c;研究如…

Ajax都有哪些优点和缺点?

AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;是一种使用多项技术的Web开发技术&#xff0c;它允许通过异步请求与服务器交换数据&#xff0c;而无需刷新整个页面。这种技术可以显著提高Web应用程序的性能和用户体验。以下是AJAX的主要优点和缺点&#xff1a; …

c#自动生成缺陷图像-添加重命名功能--20240528

using System; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Threading

前端项目上线

目录 1项目打包 2本地服务器部署 2.1具体操作步骤 2.2解决刷新 404 问题 2.3请求无法发送问题 3nginx 服务器部署 3.2nginx 配置代理练习 安装nginx nginx部署启动项目 3.3nginx 部署前端项目 4云服务器部署 本地资源上传 配置服务器与nginx 1项目打包 ●我…

【设计模式】JAVA Design Patterns——Data Transfer Object(数据传递对象模式)

&#x1f50d;目的 次将具有多个属性的数据从客户端传递到服务器&#xff0c;以避免多次调用远程服务器 &#x1f50d;解释 真实世界例子 我们需要从远程数据库中获取有关客户的信息。 我们不使用一次查询一个属性&#xff0c;而是使用DTO一次传送所有相关属性。 通俗描述 使用…

部署LAMP环境

红帽9搭建LAMP 安装Apache 2.安装数据库服务 3.安装php (1)使用IP访问/phpinfo.php 4.安装phpMyAdmin &#xff08;1&#xff09;数据库端口改为学号后五位 &#xff08;2&#xff09;登录phpmyadmin 5.SSH增加一个端口10022&#xff0c;fttp增加两个端口10080和8080 &#xf…

OceanBase 回收站功能(社区版4.2.1.0)

概述 回收站默认是关闭的。如果开启的话&#xff0c;回收站里包含 OB 被删除的对象(租户&#xff0c;表&#xff0c;索引&#xff0c;database等)。当删除OB某个对象后&#xff0c;该对象会进入回收站&#xff0c;删除对象的存储空间并不会被释放&#xff0c;仍然占用物理空间…

李廉洋:5.29黄金震荡,原油持续走高,今日美盘行情走势分析及策略。

黄金消息面分析&#xff1a;当前美国存在一个令人担忧且未被充分关注的问题&#xff1a;房地产行业低迷、高利率和抵押贷款利率、租金高涨以及美联储的紧缩政策构成了一个恶性循环。由于高房价和高抵押贷款利率&#xff0c;美国住房经济活动远低于两年前的水平。为了让该行业好…

Apache、Nginx、IIS文件解析漏洞

目录 1、文件解析漏洞介绍 2、Apache相关的解析漏洞 &#xff08;1&#xff09;多后缀解析漏洞 &#xff08;2&#xff09;Apache配置问题 &#xff08;3&#xff09;换行符解析漏洞 &#xff08;4&#xff09;罕见后缀解析 3、Nginx相关的解析漏洞 &#xff08;1&…

记录帖 ES的RestApi使用

索引库操作 import org.apache.http.HttpHost; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.client.indices.CreateIndexRequest; import …

AcWing 1047.糖果

这里介绍一种可行的方案&#xff0c;但是对于本题来说&#xff0c;数据范围是不能达到要求的&#xff1a; 也就是设置一个状态&#xff0c;表示j这个数能不能满足最大糖果个数。j这个数需要满足是k的倍数。 这样其实就简单&#xff0c;我们只需要对于状态是否进行转移就行了&…

《java数据结构》--栈的详解

一.栈的认识 栈是一种不同于链表和顺序表的储存数据结构&#xff0c;它对存储数据和取出数据有着特殊的要求&#x1f914;。 首先栈只能从一端存储数据&#xff0c;也就是从一端进&#xff0c;还从这一端出这也是栈最大的特点&#xff0c;这也导致在栈中存取数据都必须遵循先…

C++线程任务队列模型

功能描述 实现一个任务队列&#xff0c;用于任务的执行 任务队列 任务队列可以添加、删除任务&#xff0c;实现对任务的管理添加任务后&#xff0c;任务队列可以开始执行任务队列执行任务方式为串行执行 任务 任务执行需要持续一段10s内随机的时间&#xff0c;执行过程通过…

将C++ cv:mat 通过JNI 转换为jbtyearray,传到android端

cv::Mat result ; //此处为C获取到的cv::mat结果对象// 编码为JPEG格式std::vector<uchar> buf;cv::imencode(".jpg", result, buf);// 创建一个新的jbyteArray并设置其大小jbyteArray array env->NewByteArray(buf.size());if (array NULL) {// 处理内存…