Linux进程间通信(信号)

news2024/12/23 11:21:07

信号发送

信号是 Linux 系统响应某些条件而产生的一个事件,接收到该信号的进程会执行相应的操作。 信号的产生有三种方式:

(1)由硬件产生,如从键盘输入 Ctrl+C 可以终止当前进程

(2)由其他进程发送,如可在 shell 进程下,使用命令 kill -信号标号 PID,向指定进程发送信号。 

(3)异常,进程异常时会发送信号

 在 Ubuntu 终端输入 kill -l,查看所有的信号。

 下面是几个常用的函数:

 

 

 

 使用规则:

实验 1 代码:在程序中实现:自己给自己发送信号。

sig.c

#include <sys/types.h>
#include <signal.h>
#include <stdio.h>
#include <signal.h>

int main(int argc, char const *argv[])
{
    //int kill(pid_t pid, int sig);

    printf("raise before\n");
    raise(9);  //自己调用自己
    printf("raise after\n");

    return 0;
}

编译运行,如下图所示:

 

实验 2 代码 sig2.c 发送信号:

sig2.c

#include <sys/types.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>


int main(int argc, char const *argv[])
{
    // int kill(pid_t pid, int sig);
    pid_t pid;
    int sig;

    if (argc < 3)
    {
        printf("请重新输入参数\n");
        return -1;
    }

    // int atoi(const char *nptr);
    sig = atoi(argv[2]);
    pid = atoi(argv[1]);

    kill(pid,sig);

    return 0;
}

test.c

#include <stdio.h>
#include <unistd.h>

int main(int argc, char const *argv[])
{
    while (1)
    {
        sleep(1);
        printf("hello world\n");
    }
    
    
    return 0;
}

编译运行 test,如下图所示,进程会循环打印 hello world

 重新打开另一个窗口,编译 sig2.c,然后查看 test 进程的 pid 号,运行测试如下图所示;

 

实验 3 代码 sig3.c

#include <stdio.h>
#include <unistd.h>

int main(int argc, char const *argv[])
{   
    int i;

    alarm(3);   //相当于定时器

    while (1)
    {
        sleep(1);
        i++;
        printf("i = %d\n",i);
    }
    
    
    return 0;
}

编译 sig3.c,并运行。如下图所示,设定的时间(3 秒)超过后产生 SIGALARM 信号,默认动作是终 止进程。

 

信号接收

接收信号:如果要让我们接收信号的进程可以接收到信号,那么这个进程就不能停止。让进程不停止 有三种方法:

 while

 sleep

 pause

方法一:

sig4.c

#include <stdio.h>
#include <unistd.h>

int main(int argc, char const *argv[])
{
    while (1)
    {
        sleep(1);
        printf("hello world\n");
    }
    
    
    return 0;
}

编译运行结果如下所示,按 ctrl+C 会发送 SIGINT 信号:

 方法三

使用 pause()函数,函数详解如下:

 pause.c

#include <stdio.h>
#include <unistd.h>
void main(void)
{
    printf("pause before\n");
    pause();
    printf("pause after\n");
}

编译程序并运行,如下图所示:

 

信号处理

信号是由操作系统来处理的,说明信号的处理在内核态。信号不一定会立即被处理,此时会储存在信 号的信号表中。

处理过程示意图:

由上图中可看出信号有三种处理方式:

1.默认方式(通常是终止进程),

2.忽略,不进行任何操作。

3.捕捉并处理调用信号处理器(回调函数形式)。

 实验 1代码实现信号忽略:

#include <stdio.h>
#include <signal.h>
#include <unistd.h>
int main(void)
{
    signal(SIGINT,SIG_IGN);
    while(1){
    printf("wait signal\n");
    sleep(1);
}
return 0;
}

编译运行程序,如下图所示,当我们按下 ctrl+C 键的时候,信号被忽略。

 

 实验 2:代码实现采用系统默认方式处理该信号

#include <stdio.h
#include <signal.h>
#include <unistd.h>
int main(void)
{
    signal(SIGINT, SIG_DFL);
    while (1)
    {
        printf("wait signal\n");
        sleep(1);
    }
    return 0;
}

编译运行程序,如下图所示,按 ctrl+c

 实验 3 代码实现捕获到信号后执行此函数内容

#include <signal.h>
#include <stdio.h>
#include <unistd.h>

void myfun(int sig)
{
    if(sig == SIGINT)
    {
       printf("get singnal %d\n",sig);
    }
    
}


int main(int argc, char const *argv[])
{
    //signal(int signum, sighandler_t handler)
    signal(SIGINT,myfun);  // SIG_IGN:忽略信号  SIG_DFL: 系统默认信号
    while (1)
    {
        printf("wait signal\n");
        sleep(1);
    }
    
    return 0;
}

编译运行程序如下图所示,当我们按下 ctrl+c 时,显示 myfun 函数里面的打印信息。

 

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

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

相关文章

PostgreSQL修炼之道之高可用性方案设计(十七)

目录 20 高可用性方案设计&#xff08;二&#xff09; 20.2 基于共享存储的高可用方案 20.2.1 SAN存储的方案 20.2.2 DRBD的方案 20.3 WAL日志同步或流复制同步的方案 20.3.1 持续复制归档的standby的方法 20.3.2 异步流复制的方案 20.3.3 基于同步流复制方案 20.4 基于…

国内外低代码开发平台发展情况如何?

国内外低代码开发平台发展情况如何&#xff1f;之前有些过很多关于低代码的内容&#xff0c;这篇就来详细梳理下国内外低代码开发平台发展现状。 关于低代码解读看这篇>>什么是低代码&#xff08;Low-Code&#xff09;&#xff1f;关于低代码平台看这篇>>主流的开…

业务高速增长,如祺出行如何用腾讯云消息队列 RocketMQ 应对挑战

导语 作为广汽集团旗下的智慧出行平台&#xff0c;如祺出行上线四年时间&#xff0c;用户规模和订单量保持高速增长。在过去的2022年&#xff0c;如祺出行平台累计注册用户突破1800万&#xff0c;同比增长64%&#xff0c;年度订单总量超7000万&#xff0c;同比增长52%。 高速…

【MCS-51】串行I/O接口及其通信

我们知道MCS-51中有很多的引脚&#xff0c;这些引脚很多一般都是用作输入或者输出口&#xff0c;其中有两个引脚P3.0和P3.1比较特殊&#xff0c;我们常将其用作串行通信的数据发送和接收端TXD、RXD。 目录 &#x1f431;通信方式 &#x1f431;串行通信的传输方式和数据通信…

python笔记17_实例演练_二手车折旧分析p2

…… 书接上文 4.车辆等级维度 探查车龄为5年的车辆&#xff0c;折旧价值与车辆等级的关系。 # 筛选出车龄为5的数据创建新表 data_age5 data[data[age] 5] data_age5 # 分组聚合计算均值 data_car_level data_age5.groupby(car_level_name)[lowest_price].mean().reset…

16.2:岛屿数量问题

文章目录 岛屿数量问题方法一&#xff1a;采用递归的方法方法二&#xff1a;使用并查集的方法&#xff08;map&#xff09;方法三&#xff1a;使用并查集的方法&#xff08;数组&#xff09; 岛屿数量问题 测试链接&#xff1a;https://leetcode.com/problems/number-of-islan…

大数据:分布式计算,MapReduce,hadoop的计算组件,hive是sql分布式计算框架,底层就是基于MapReduce的

大数据&#xff1a;分布式计算&#xff0c;MapReduce&#xff0c;hadoop的计算组件&#xff0c;hive是sql分布式计算框架&#xff0c;底层就是基于MapReduce的 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学…

【C++】一文带你入门 STL

一 STL 组成 graph LRA[STL] --- B[容器 container]A --- C[配接器 adapter]A --- D[迭代器 iterator]A --- E[仿函数 function]A --- F[算法 algorithm]A --- G[空间配置器 allocator]二 常用容器 容器简介 下面我们来简单看一下这些容器的常用接口的使用&#xff0c;并分析…

更新中-深度学习实战中遇到的一些概念+少量代码

onnx ONNX 是一种用于机器学习模型的开放式表示格式&#xff0c;它可以让不同的深度学习框架之间共享模型。 import onnxruntime # 加载模型 session onnxruntime.InferenceSession(model.onnx) # 运行模型。第一个参数是输出变量列表&#xff0c;不指定的话返回所有值 outp…

ESP8266使用MicroPython接入ThingsBoard

1、概述 我们老大当初叫我学习microPython,这个可以直接将代码发到板子上,然后就可以跑,就相当于设备业务代码由我们来写,不仅仅是让嵌入式来写,嵌入式做的就是封装函数,我们可以调用.最终这个还是实现了,但是没有推广. 2、设备 我自己购买的设备是ESP8266,某宝上购买的,mic…

智能仓储系统哪家公司做的比较好?求推荐排名不错的智能仓储公司?

什么是仓储服务信息平台&#xff1f;仓储服务信息平台可以为企业提供哪些便利&#xff1f; 随着电商和物流行业的快速发展&#xff0c;仓储服务越来越受到人们的关注。为了更好地管理仓储服务&#xff0c;提高效率&#xff0c;降低成本&#xff0c;仓储服务信息平台也应运而生…

CTF国赛2023 - ukfc(四道逆向已下班)

没啥好说的&#xff0c;惜败已复现&#xff1a;badkey1、国粹、ezbyte、moveAside、ezAndroid Notice&#xff1a;复现时候的一些题解来源于各大战队的wp&#xff0c;比如F61d&#xff0c;侵删 Re ezbyte 首先跟踪很容易分析到前后缀 至于里面的&#xff0c;得知道是dwarf…

哪个牌子的电容笔好用?Apple Pencil平替

随着时代的进步&#xff0c;数码产品在人们日常生活中的使用频率越来越高&#xff0c;一个iPad和一支电容笔似乎已然成为人们主要的学习工具了。电容笔的发展速度很快&#xff0c;在众多的电容笔牌子中&#xff0c;什么牌子好用又便宜&#xff1f;下面&#xff0c;我来给大家推…

深度学习进阶篇[8]:对抗神经网络GAN基本概念简介、纳什均衡、生成器判别器、解码编码器详解以及GAN应用场景

【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等 专栏详细介绍&#xff1a;【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化…

FastReport Business Graphics .NET 2023.1 Crack

FastReport 商业图形 .NET .NET WinForms 的数据可视化库 使用 FastReport 业务图形库&#xff0c;您可以可视化不同层次的数据&#xff0c;构建业务图表以供进一步分析和决策。 所有这些都可以直接在您的应用程序中工作&#xff01; 利用 .NET 7、.NET Core、Blazor、ASP.NE…

数据采集学习心得

数据采集是指从互联网或其他数据源中收集数据的过程。在当今信息时代&#xff0c;数据采集已经成为了一项非常重要的技能。无论是在商业领域还是学术领域&#xff0c;数据采集都是非常必要的。本文将分享我在学习数据采集过程中的心得体会。 一、数据采集的重要性 在当今信息…

高考即将到来,如何选择大学和专业?(2023版本)

同学们&#xff0c;高考又快到了&#xff0c;怎么选择大学和专业一直是同学们心烦的事情&#xff0c;正所谓“选择大于努力”&#xff0c;选择错了&#xff0c;努力方向自然就错了&#xff0c;事倍功半&#xff0c;甚至南辕北辙&#xff0c;所以对此我们必需慎之又慎&#xff0…

Mybatis自定义分页插件及PageHelper源码分析

文章目录 前言一、自定义一个简单的mybatis分页插件&#xff1f;1.判断当前传参是不是一个Page&#xff0c;如果是page就进行转换。2.分页查询总条数3.修改原有sql4.执行原有方法5.存在问题&#xff1a; 二、PageHelper分析1.PageHelper简介2.PageHelper源码分析 三&#xff1a…

概率论:假设检验

参考书目&#xff1a;《行为科学统计精要》&#xff08;第八版&#xff09;——弗雷德里克J格雷维特 1、假设检验预备知识 Z分位数样本均值的分布标准误 参考&#xff1a; 概率论&#xff1a;样本与总体分布&#xff0c;Z分数与概率_格勒王的博客-CSDN博客如何理解样本和整体…

Linux入门到进阶

文章目录 前言一、第一章-初识Linux1.初识Linux2.虚拟机介绍3.VMware Workstation安装4.在VMware上安装Linux5.远程连接Linux系统6.扩展&#xff1a;WSL&#xff08;Windows Subsystem for Linux&#xff09;7.扩展&#xff1a;虚拟机快照 二、第二章-Linux基础命令1.Linux的目…