进程间通信的方式(附代码分析)

news2025/1/17 14:10:32

进程间通信的方式

1. 进程间通信的几种方式

  • 管道

    比如 ls | grep 1;也就是将 进程 ls 拿到的结果作为 grep 1 这个进程的输入。实现了进程间的通信。

  • 消息队列

    消息队列就是我们的内核给我们创建的一种消息队列。我们可以往其中发送消息,也可以从其中接收消息。

  • 共享内存

    每个进程在访问内存的时候,会有虚拟内存地址和物理内存地址的一个映射。一般来说,俩个进程的虚拟内存地址可以是一样的,但是它们映射的物理内存地址是不一样的。共享内存就是将俩个进程的内存地址也是一样的。这个时候,俩个进程就可以访问共同的物理内存,实现通信。

  • 套接字

    比如访问数据库的进程和数据库进程本身之间的通信。

  • 信号

    信号就是说一个进程在运行的时候可以向另外的一个进程发送信号。
    可以通过 kill -l 指令可以列举出所有的信号指令。kill 和信号有什么关系呢?linux 的信号大多数都是将一个进程杀死。

2. 进程间通过信号进行通信的几个例子

  • 比如说使用命令 tail -f 1.txt, 运行了这个命令以后,这个进程会一直存在。那么怎么终止呢? ctrl + c, 就可以终止这个进程。其实这时候就是shell 终端进程向 运行的这个进程发送了一个 信号,这个信号的值其实是 SIGINT。

  • 比如说使用命令 tail -f 1.txt, 运行了这个命令以后,这个进程会一直存在。那么怎么终止呢?还可以通过 kill + 进程号。其实这时候就是shell 终端进程向 运行的这个进程发送了一个 信号,这个信号的值其实是 Terminated。

  • 比如说使用命令 tail -f 1.txt, 运行了这个命令以后,这个进程会一直存在。那么怎么终止呢?还可以通过 kill -9 + 进程号。其实这时候就是shell 终端进程向 运行的这个进程发送了 9号 信号,这个信号的值其实是 Killed。

3. 通过程序捕获信号

通过在程序中捕获信号,比如说,我们运行了一个java程序,但是我们想做到 ctrl + c , 和 kill + 进程号
,都不能终止这个进程,那么我们就可以捕获相应的信号。

  • 程序如下:
package org.example;

import sun.misc.Signal;
import sun.misc.SignalHandler;

public class Main {

    public static void main(String[] args) throws InterruptedException {

        // 注册信号的处理。捕获 SIGINT 信号的处理。
        Signal.handle(new Signal("INT"), new SignalHandler() {
            @Override
            public void handle(Signal signal) {

                System.out.println(signal.toString() + "catched");

            }
        });

        // 循环打印123
        while (true) {

            Thread.sleep(1000);
            System.out.println(123);

        }

    }
}
  • 通过 javac 命令编译这个程序
    请添加图片描述

  • 通过 java 命令运行这个程序 可以看到控制台打印了如下内容,并且通过ctrl + c不能终止这个进程
    请添加图片描述

  • 通过 kill + 进程号 终止这个进程。注意: Killed 这个信号是无法被捕获的,执行了 kill -9 ,那么这个进程必须被强制杀死。
    请添加图片描述

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

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

相关文章

C语言实现有序序列判断

一个数组,判断是否有序看上去很简单,有很多种方法。但实际上有一个很严重的问题,就是重复数会影响判断结果。 我这里提供的思路是取连续的三个数进行比较,a, b, c,假设一共n个元素,数组名是arr&#xff0c…

阿里云Imagine Computing创新技术大赛决赛启幕!

2023年1月,由阿里云与英特尔主办,阿里云天池平台、边缘云、视频云共同承办的“新算力 新体验”Imagine Computing创新技术大赛复赛圆满落幕。经过两个多月的激烈角逐,12支入围队伍,从海内外8个国家和地区的6900余支参赛队伍中脱颖…

转到结构化写作后的几点变化

或许是随着公司产品越来越多,公司的手册越来越复杂,用户越来越难找到需要的信息;或许是因为公司管理手册的使用者不满足于长篇大论的文字,希望能够获得只跟他相关的政策、程序等信息。 总之,公司决定从MS Word、非结构…

Pipeline机器学习模型串联

机器学习模型训练时使用 Pipeline 是一个加快效率的串联方法。Pipeline 处理机制就像是把所有模型塞到一个管子里,然后依次对数据进行处理,得到最终的分类结果。 # 模型串联 pipPipeline( [ # 所有模型写…

Matlab Spreadsheet Link安装(早期叫excllink)

我们在Matlab和Excel之间进行数据交互,需要用到Excel link这个组件(这是早期的叫法),现在这个组件的名称叫做Spreadsheet Link,这个在我们安装Matlab的时候,要选择相应的组件来安装(有可能我们刚…

find命令的常见用法

1.find 命令的常见用法 1.1 基础的打印操作 find命令默认接的命令是-print,它默认以\n将找到的文件分隔。可以使用-print0来使用\0分隔,这样就不会分行了。但是一定要注意,-print0针对的是\n转\0,如果查找的文件名本身就含有空格…

高一物理题整理

1 船过河问题 【分析及解答】 这个题的关键是如何理解船的速度,题目假设船的速度是不变的,也就是一直是v2v_2v2​。 列方程如下: {120v1∗10dv2∗10dv2sin⁡θ∗12.5v1v2cos⁡θ\left\{\begin{array}{l} 120 v_1 * 10 \\ d v_2 * 10 \\ d …

【我的渲染技术进阶之旅】解决Cinema 4D制作的3D模型无法导入Blender的问题

文章目录一、问题描述二、分析问题2.1 查看material材质的mtl文件2.2 mtl文件介绍2.3 对比mtl文件和mtl语法并修改2.3.1 norm不对2.3.2 map_Ka、map_Kd 、map_Ks、map_Bump 的格式不对2.5 重新导出obj格式和mtl文件三、总结一、问题描述 今天UI输出了个3D模型给我,…

Spring是如何解决循环依赖的?

一、什么是循环依赖? 循环依赖:说白了就是一个或多个对象实例之间存在直接或间接的依赖关系,这种依赖关系构成了一个环形调用。 第一种情况:自己依赖自己的直接依赖 第二种情况:两个对象之间的直接依赖 第三种情况…

Android 深入系统完全讲解(11)

9 framework 内容组成 狭义的 framework,主要讲的就是 SystemServer 里面的所有服务,这些是在 framework, 而广义的就是包含了 rec,native 服务,系统 app 等一切分不出去的模块,所以 framework 要能做好&a…

睿尔曼 RM65-B 机械臂 WIN 示教软件测试

大家好,我是虎哥,最近开始接触机械臂,尤其是协作机械臂,小,轻、还价格便宜一点,由于我师兄弟强烈推荐的睿尔曼 RM65-B机械臂,所以总结一下自己的开箱测试经验,主要是在WIN下 示教器软…

Protobu编译本地环境搭建

1 windows下安装Protobuhttps://github.com/protocolbuffers/protobuf/releases2 安装cmakehttps://cmake.org/download/3选择选择你的VS版本4生成pb运行程序5 protoc --cpp_out生产pb文件将刚才编译后的libprotobufd.lib和protoc.exe拷贝到自己创建的项目下,按住sh…

express中间件

文章目录中间件定义一个最简单的中间件自定义中间件中间件的五个使用注意事项Express 基于 Connect 构建而成,因此,它也保持了重用中间件来完成基础任务的想法。这就意味着,通过 Express 的 API 方便地构建 Web 应用地同时,又不失…

基于vgg16和pytorch框架进行cifar10数据集的图像分类

vgg16网络模型的实现 这里只讲怎么实现 百度搜到vgg16的网络模型图,用pytorch框架进行实现 图是这样,用pytorch实现就行,pyotrch不太熟悉的话可以去看小土堆的视频 命名mode.py 也可以使用其他名字,在后面的train.py里面改一下也…

【C语言进阶】内存函数和结构体内存对齐

目录一.strerror函数1.错误码变量errno2.strerror函数的使用3.perror函数二.memcpy函数1.函数介绍2.模拟实现三.memmove函数1.函数介绍2.模拟实现四.结构体的内存对齐一.strerror函数 1.错误码变量errno 规定: C语言库函数如果出现运行错误,会将对应错误信息的错误…

联邦学习 (FL) 中常见的3种模型聚合方法的 Tensorflow 示例

联合学习 (FL) 是一种出色的 ML 方法,它使多个设备(例如物联网 (IoT) 设备)或计算机能够在模型训练完成时进行协作,而无需共享它们的数据。 “客户端”是 FL 中使用的计算机和设备,它们可以彼此完全分离并且拥有各自不…

基于Java springmvc+mybatis酒店信息管理系统设计和实现

基于Java springmvcmybatis酒店信息管理系统设计和实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取…

程序员接私活的几个平台和建议,避免掉坑!

大家对于程序员接私活这件事的看法,褒贬不一。但是你如果确实用钱,价格又合适,那就大胆去接。 如果不那么缺钱,那么接私活之前先考虑清楚,如果自己将空余时间用在接私活所产生的价值是不是大于提升自己。如果是的话&a…

2022年 大学生工程训练比赛[物料搬运]

本人和团结参加了2022年大学生工程训练(简称工训赛)校赛选拔,准备了几个月的时间和花费了较多的资金,由于疫情等多种情况,很遗憾未能参加湖南省省赛,过了这么久还是写个博客记录参赛准备和调试过程。 目录 一、比赛要求 二、整体…

第十章面向对象编程(高级部分)

10.1 类变量和类方法(关键字static) 10.1.31类变量快速入门 思考: 如果,设计一个 int count 表示总人数,我们在创建一个小孩时,就把 count 加 1,并且 count 是所有对象共享的就 ok 了! package com.hspedu.static_;public class ChildGame {…