并发 -------- 2.2 进程间的通信 - 信号

news2024/9/8 23:45:00

前言:进程间的通信包括


        IPC: 
            1、管道
                pipe 无名管道
                fifo 有名管道 
            2、信号 signal         <-----------
            3、消息队列 System V消息队列 / POSIX消息队列 
            4、共享内存 System V共享内存 / POSIX共享内存 
            5、信号量   System V信号量 / POSIX信号量 
            6、socket套接字


1、信号 

    信号 是进程间通信的一种方式,这个方式没有传输数据 ,只在内核中传递了一个整数 这个整数值 就是信号值 ,不同的信号值,代表不同的含义,同样的,用户也可以自定义信号,自定义的信号的值和含义,由程序设计者来解释 

    查看信号值:  trap -l 

  1.1 当一个进程收到一个信号,可能发生5种默认行为 (  man 7 signal )

            Term   Default action is to terminate the process.
                    默认行为 是终止进程

            Ign    Default action is to ignore the signal.
                    默认行为 是忽略信号

            Core   Default action is to terminate the process and  dump  core  (see core(5)).
                    默认行为 输出信息,然后再终止进程

            Stop   Default action is to stop the process.
                    默认行为 是停止进程

            Cont   Default  action  is  to  continue the process if it is currently stopped.
                    默认行为 如果进程当前是停止的,则继续该进程 

扩展:


        Signal     Value     Action   Comment
       ──────────────────────────────────────────────────────────────────────
       SIGHUP        1       Term    Hangup detected on controllinprocessg terminal or death of controlling 
                                       控制终端的挂起操作,或者是控制进程的死亡 
                                       这个终端上的所有的进程都会收到 SIGHUP 
       
       SIGINT        2       Term    Interrupt from keyboard 
                                        键盘上收到的中断信号  Ctrl c 
       
       SIGQUIT       3       Core    Quit from keyboard 
                                        键盘上收到的退出信号  Ctrl z 或者 Ctrl d 

       SIGILL        4       Core    Illegal Instruction 
                                        非法指令 (比如:除数为0) 

       SIGABRT       6       Core    Abort signal from abort(3)
                                        进程正在调用 abort()函数,就会产生 SIGABRT 

       SIGFPE        8       Core    Floating-point exception
                                        浮点数运算运算异常 

       SIGKILL       9       Term    Kill signal
                                        杀死信号   // kill -9 pid

       SIGSEGV      11       Core    Invalid memory reference
                                        非法内存引用,段错误,就会收到 SIGSEGV 

       SIGPIPE      13       Term    Broken pipe: write to pipe with no readers; see pipe(7)
                                        当你往一个管道文件中写数据时,没有读端,就会收到 SIGPIPE

       SIGALRM      14       Term    Timer signal from alarm(2)
                                        当进程调用 alarm()函数时,就会产生闹钟信号 SIGALRM 

       SIGTERM      15       Term    Termination signal
                                        终止信号    // kill pid 

       SIGUSR1   30,10,16    Term    User-defined signal 1  用户自定义的信号 
       SIGUSR2   31,12,17    Term    User-defined signal 2

       SIGCHLD   20,17,18    Ign     Child stopped or terminated
                                       子进程停止或终止,父进程就会收到 SIGCHLD 

       SIGCONT   19,18,25    Cont    Continue if stopped  如果进程停止了,则继续

       SIGSTOP   17,19,23    Stop    Stop process       停止 

       SIGTSTP   18,20,24    Stop    Stop typed at terminal  由控制终端发出的停止信号

       SIGTTIN   21,21,26    Stop    Terminal input for background process
       SIGTTOU   22,22,27    Stop    Terminal output for background process

        注意: 
            The signals SIGKILL and SIGSTOP cannot be caught, blocked, or ignored. 
            SIGKILL 和 SIGSTOP 不能被捕捉、不能被阻塞、不能被忽略。 

    
    1.2当一个进程收到一个信号,有3中处理方式: 

        (1)默认行为 
            收到一个信号,采用的操作系统的默认行为

        (2)忽略信号  

        (3)捕捉信号 
            把一个信号 和 用户自定义的处理函数 相关联 
            那么收到这个信号的时候,就会自动调用 该处理函数 


2、信号处理的过程 

    信号机制的实现原理:是软中断实现的,即打断用户程序的执行 

        进程上下文: 
                用户态:在执行用户自己的程序时
                内核态:进入到操作系统内核中去执行的  


3、Linux操作系统下 与信号相关的接口函数 

    3.1)发送信号 

        3.1.1)kill 

        NAME
            kill - send signal to a process
        SYNOPSIS
            #include <sys/types.h>
            #include <signal.h>

            int kill(pid_t pid, int sig);
                功能:发送一个信号sig 给pid指定的进程
                参数: 
                    pid:进程pid,指定信号的接受者(可以是多个进程)
                            pid > 0     pid所代表的那个进程 
                            pid == 0    发送信号给 与 调用进程同组的所有进程 
                            pid == -1   发送给所有进程(慎用) 
                            pid < -1    发送信号给 组id为pid的绝对值的那个进程组 里的所有进程
                    sig:指定要发送的信号值 
                返回值: 
                    成功,返回0(至少有一个进程接收到信号) 
                    失败,返回-1,同时errno被设置 
           


                给自己发送一个杀死信号 

                int main()
                {
                    sleep(5);

                    //给自己发送一个杀死信号 
                    kill( getpid(), 9 );        // SIGKILL

                    printf("hahahah \n");

                    while(1);
                }


        3.1.2)raise() 发送一个信号给自己 

                NAME
                    raise - send a signal to the caller
                SYNOPSIS
                    #include <signal.h>

                    int raise(int sig);
                        功能:发送一个信号sig给自己 (当前调用进程)
                        参数: 
                            sig:指定要发送的信号值 
                        返回值: 
                            成功,返回0 
                            失败,返回非0


            3.1.3)alarm()

               设置定时,在指定的时间后给自己发送一个 SIGALRM 信号 

                NAME
                    alarm - set an alarm clock for delivery of a signal
                SYNOPSIS
                    #include <unistd.h>

                    unsigned int alarm(unsigned int seconds);
                        功能:定时发送一个闹钟信号SIGALRM给自己 
                        参数: 
                            seconds:指定定时时间(单位:秒) 
                        返回值: 
                            返回,上一次闹钟 剩余的秒数 

                    注意: 
                        闹钟时间一到,当前调用进程 就会收到一个闹钟信号 SIGALRM 
                        同一时刻 一个进程只能有一个闹钟生效 
                        设置一个闹钟的定时时间,会自动把之前的闹钟清除 


    3.2)捕捉信号 


        改变信号的处理方式 ,signal()  把 信号 和 用户自定义的处理函数 相关联起来  ---》 捕捉 

            NAME
                signal - ANSI C signal handling
            SYNOPSIS
                #include <signal.h>

                typedef void (*sighandler_t)(int);
                    功能:把 信号 和 用户自定义的处理函数 相关联起来 
                    参数: 
                        signum:指定要捕捉或者相关联的信号值
                        handler:函数指针,指定新的信号处理方式 
                                    (1)指定用户自定义的信号处理函数 
                                    (2)SIG_IGN 忽略信号 
                                    (3)SIG_DFL 采用系统默认的信号处理方式 
                    返回值: 
                        成功,返回该信号上一次的处理方式 (第一次返回NULL)
                        失败,返回SIG_ERR,同时errno被设置 

                注意: 
                    1)在进程的运行期间 都是可以去捕捉指定的信号的
                    2)可以让不同的信号 去共享同一个信号处理函数 

                    3)sighandler_t是一个新类型,是一个函数指针类型,指向了一个 带有一个int类型参数且无返回值的函数。也就是用户自定义的信号处理函数的类型: 
                            void xxxx( int signum )     //signum:信号值
                            {
                            }

                sighandler_t signal(int signum, sighandler_t handler);


                写一个程序,设置一个闹钟5s,捕捉闹钟信号,当收到闹钟信号是,打印 "wake up"

                在用户按下ctrl c, 进程不死亡,而是打印一句 "收到了 xxx 信号 "

                //用户自定义的信号处理函数 
                void my_handler(int signum)
                {
                    if( signum == SIGALRM )  
                    {
                        printf("wake up\n");
                    }
                    else if( signum == SIGINT )
                    {
                        printf("收到了 SIGINT 信号\n");
                    }
                }

                int main()
                {
                    //设置一个闹钟5s
                    alarm( 5 );

                    //捕捉信号 
                    signal( SIGALRM, my_handler );  

                    signal( SIGINT, my_handler );

                    //while(1);

                    pause();    //挂起进程,等待信号到来 

                }


    3)等待一个信号的到来 pause 

            NAME
                pause - wait for signal
            SYNOPSIS
                #include <unistd.h>

                int pause(void);
                    功能:将进程挂起,直到等待一个信号的到来 
                    参数:无 
                    返回值:
                        成功,等待了信号 
                        失败,返回-1,同时errno被设置 

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

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

相关文章

基于web的跨校区通勤车班次规划系统/校车管理系统

获取源码联系方式请查看文章结尾&#x1f345; 摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而…

STM32项目分享:智能台灯(机智云)系统

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 PCB图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片&#xff1a; 哔哩哔哩视频链接&#xff1a; https://www.bilibili.com/video/BV1My411q7fE…

常见的CSS属性(一)——字体、文本、边框、内边距、外边距、背景、行高、圆角、透明度、颜色值

一、字体 二、文本 三、边框 四、外边距 五、内边距 六、背景 七、行高 八、圆角 九、透明度 九、颜色值 元素的继承性是指给父元素设置了某些属性&#xff0c;子元素或后代元素也会有作用。 一、字体 “font-*”是字体相关的属性&#xff0c;具有继承性。代码如下&a…

长上下文语言模型与RAPTOR 方法

在科技领域的前沿&#xff0c;长上下文语言模型&#xff08;Long Context LLMs&#xff09;和新兴检索方法如RAPTOR 正在引发广泛关注。本文将围绕这些技术展开讨论&#xff0c;并探讨它们在实际应用中的创新性和科技性。 长上下文语言模型的崛起 近几周来&#xff0c;随着新型…

基于 SSM 的汽车租赁系统

基于 SSM 的电器网上订购系统 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;Spring、JSP、MyBatis 工具&#xff1a;MyEclipse/IDEA、Tomcat 引言 汽车租赁是在约定时间内&#xff0c;租赁经营人将租赁汽车&#xff08;包括载货汽车和载客汽车&#x…

前端在浏览器总报错,且获取请求头中token的值为null

前端请求总是失败说受跨域请求影响&#xff0c;但前后端配置已经没有问题了&#xff0c;如下&#xff1a; package com.example.shop_manage_sys.config;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Conf…

paddle ocr 文字识别模型训练 svtr

训练模型方法参考&#xff1a;https://github.com/PaddlePaddle/PaddleOCR/blob/main/doc/doc_ch/recognition.md 实践&#xff1a;https://aistudio.baidu.com/projectdetail/4482681 SVTR 算法原理 SVTR: Scene Text Recognition with a Single Visual Model Yongkun Du a…

Linux网络-ss命令

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注我&#xff0c;我尽量把自己会的都分享给大家&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 Linux服务器作为一个常用的网络服务器&#xff0c;主要的作用就是向客户端提供网络…

数据结构(邓俊辉)学习笔记】高级搜索树03——红黑树

文章目录 1. 动机1.1 观察体验1.2 持久性1.3 关联性1.4 O&#xff08;1&#xff09;重构 2. 结构2.1 定义规则2.2 实例验证2.3 提升交换2.4 末端节点2.5 红黑树&#xff0c;即是B树2.6 平衡性2.7 接口定义 3. 插入3.1 以曲为直3.2 双红缺陷3.3 算法框架3.4 RR-13.5 RR-23.6 归纳…

将nvim的配置 上传gitee

首先是创建仓库 接着进入这个界面 然后是上传代码&#xff0c; 结果&#xff1a; 可以看到已经是可以了。 然后是 拉取代码进行测试。 第一次 拉取 使用 git clone .&#xff08;家里&#xff09; 做一点修改&#xff0c;然后上传。&#xff08;公司&#xff09; 然后在git pu…

Kotlin 的优势:现代编程语言的卓越选择

文章目录 简洁与优雅的语法空安全特性函数式编程&#xff0c;支持高阶函数、lambdaKotlin 内联函数与 Java 的互操作性强大的类型推断协程支持lazy 委托object 单例模式区间表达式现代的开发工具支持 本文首发地址 https://h89.cn/archives/301.html 最新更新地址 https://gite…

2024-07-27 Unity Excel —— 使用 EPPlus 插件读取 Excel 文件

文章目录 1 前言2 项目地址3 使用方法3.1 写入 Excel3.2 读取 Excel3.3 读写 csv 文件 4 ExcelSheet 代码 1 前言 ​ 前几日&#xff0c;一直被如何在 Unity 中读取 Excel 的问题给困扰&#xff0c;网上搜索相关教程相对古老&#xff08;4、5 年以前了&#xff09;。之前想用 …

探索 Electron:如何进行网址收藏并无缝收录网页图片内容?

Electron是一个开源的桌面应用程序开发框架&#xff0c;它允许开发者使用Web技术&#xff08;如 HTML、CSS 和 JavaScript&#xff09;构建跨平台的桌面应用程序&#xff0c;它的出现极大地简化了桌面应用程序的开发流程&#xff0c;让更多的开发者能够利用已有的 Web 开发技能…

嵌入式人工智能(28-基于树莓派4B的语音播报模块-SYN6288)

1、语音播报模块 语音播报在一些嵌入式场景中很常见&#xff0c;广泛应用于游戏篮球机音效语音播报&#xff0c;跑步机语音导航&#xff0c;按摩椅语音操作指引&#xff0c;设备故障提示&#xff0c;设备操作引导语音&#xff0c;车载安全语音警示&#xff0c;公共场所语音提示…

系统移植(七)u-boot移植 ④ trusted版本

文章目录 一、U-boot源码适配&#xff08;一&#xff09;执行make stm32mp15_trusted_defconfig命令进行配置&#xff0c;生成.config文件&#xff08;二&#xff09;执行make menuconfig命令&#xff0c;对u-boot源码进行重新配置1. 对u-boot源码进行配置&#xff0c;移除pmic…

Executable Code Actions Elicit Better LLM Agents

Executable Code Actions Elicit Better LLM Agents Github: https://github.com/xingyaoww/code-act 一、动机 大语言模型展现出很强的推理能力。但是现如今大模型作为Agent的时候&#xff0c;在执行Action时依然还是通过text-based&#xff08;文本模态&#xff09;后者JSO…

Java Web——第一天

Web开发课程安排 Web标准 Web标准也称为网页标准&#xff0c;由一系列的标准组成&#xff0c;大部分由W3C( World Wide Web Consortium&#xff0c;万维网联盟)负责制定 三个组成部分: HTML:负责网页的结构 (页面素和内容) CSS:负责网页的表现 (页面元素的外观、位置等页面…

Ubuntu 20.04.6 安装 Elasticsearch

1.准备 -- 系统更新 sudo apt update sudo apt upgrade -- 安装vim 文本编辑器 sudo apt install vim-- jdk 版本确认 java -versionjdk 安装可以参照&#xff1a;https://blog.csdn.net/CsethCRM/article/details/140768670 2.官方下载Elasticsearch 官方地址&#xff1a;h…

PPT图表制作

一、表格的底纹 插入→表格→绘制表格→表设计→选择单元格→底纹 二、把一张图片做成九宫格 1. 把一张图片画成九宫格&#xff08;处理过后还是一张图片&#xff0c;但是有框线&#xff09; 绘制33表格→插入图片→全选表格单元格→右键设置形状格式→填充→图片或纹理填充…

Teamcenter RAC开发,创建Item的两种方式

1、如果描述不必填&#xff0c;采用胖客户端的创建方式 newItem itemType.create(newItemId, "", targetTypeComp.getTypeName(), item_name, // "test1", null, null2、如果描述必填&#xff0c;则需要采用SOA的创…