进程间通信:连接不同程序世界的桥梁

news2024/12/24 11:26:43

目录

一、进程间通信的重要性

二、常见的进程间通信方式

三、进程间通信的目的

四、进程间通信的本质


在计算机编程的领域中,进程间通信(Inter-Process Communication,IPC)是一个至关重要的概念。当我们在操作系统中运行多个程序或进程时,它们往往需要相互协作、交换信息,而这就是进程间通信发挥作用的地方。

一、进程间通信的重要性

想象一下,在一个复杂的系统中,可能有多个进程同时运行,比如一个图形界面程序、一个数据处理程序和一个网络通信程序。它们各自承担着不同的任务,但有时需要共享数据、协调行动或发送信号。没有有效的进程间通信机制,这些进程就会如同孤立的岛屿,无法高效地协同工作。


在一个分布式计算系统中,不同的计算节点需要通过网络套接字进行通信,以协调任务分配和结果汇总。在一个多线程的应用程序中,线程之间可能通过共享内存来高效地共享数据。而在操作系统中,内核与用户进程之间也常常通过信号来传递重要的事件信息。

二、常见的进程间通信方式

  1. 管道(无名管道与有名管道)
    • 原理与特点:无名管道主要用于具有亲缘关系的进程间通信,而有名管道则可用于无亲缘关系的进程。它们具有简单、高效的特点。
    • 示例代码:创建无名管道并进行数据传输的简单示例。
      #include <iostream>
      #include <cassert>
      #include <cstring>
      #include <unistd.h>
      #include <sys/types.h>
      #include <sys/wait.h>
      
      #define MAX 1024
      
      using namespace std;
      
      int main()
      {
          // 建立管道
          int pipefd[2] = {0};
          int n = pipe(pipefd);
          assert(n == 0);
          (void)n;
          cout << "pipefd[0]:" << pipefd[0] << ",pipefd[1]:" << pipefd[1] << endl;
      
          // 创建子进程
          int pid = fork();
          if (pid < 0)
          {
              perror("fork");
              exit(1);
          }
          // 建立单向通信管道,子写 父读
          else if (pid == 0)
          {
              // child
              close(pipefd[0]);
              char message[MAX];
              int cnt = 10;
              while (cnt)
              {
                  snprintf(message, sizeof(message) - 1, "hello father! I am child,pid:%d,cnt:%d", getpid(), cnt);
                  // 向管道写入信息
                  write(pipefd[1], message, strlen(message));
                  cnt--;
                  sleep(1);
              }
          }
      
          // father
          close(pipefd[1]);
          // 向管道读取信息
          char buffer[MAX];
          while (true)
          {
              ssize_t n = read(pipefd[0], buffer, sizeof(buffer) - 1);
              if (n > 0)
              {
                  buffer[n] = '\0';
                  cout << getpid() << ",child say:" << buffer << " to me" << endl;
              }
          }
      
          int rid = waitpid(pid, nullptr, 0); // ?
          if (rid == pid)
          {
              cout << "wait success!" << endl;
          }
      
          return 0;
      }
  2. 消息队列
    • 工作机制:进程可以将消息发送到队列中,其他进程从队列中获取消息。
    • 优势与应用:提供了一种异步通信方式,适合不同速率的进程间通信。
  3. 共享内存
    • 实现原理:多个进程共享一段物理内存区域。
    • 同步问题处理:需要通过信号量等机制来确保数据的一致性。
  4. 信号和信号量
    • 常见信号类型:如 SIGINT、SIGTERM 等。
    • 信号的发送与接收:如何发送和响应信号。
    • 信号量则侧重于更复杂的同步和资源管理机制。
  5. 套接字
    • 本地套接字与网络套接字在进程间通信中的应用:可实现跨机器的进程通信。

三、进程间通信的目的

  • 数据传输:一个进程需要将它的数据发送给另一个进程
  • 资源共享:多个进程之间共享同样的资源。
  • 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。
  • 进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另 一个进程的所有陷入和异常,并能够及时知道它的状态改变。

四、进程间通信的本质

进程是资源分配和系统调度运行的基本单位。

从资源分配角度来看,进程拥有自己独立的各种资源,如内存空间、文件描述符等,操作系统会为其分配所需的资源。每个进程都有自己独立的资源和运行环境,相互之间相对隔离。

为了确保进程的独立性,但进程间又需要通信,所以我们需要一个第三方来为进程间做沟通的中间人,这个第三方就是操作系统,操作系统通过让不同进程间看到同一份资源的方式来让进程间建立沟通。

通信的本质就是:让不同进程看到同一份资源,这份资源是操作系统内核的资源,这是进程通信的指导思想,无论是哪种通信方式的实现,都是基于这个思想!

每个进程的用户地址空间都是独立的,一般而言是不能互相访问的,但内核空间是每个进程都共享的,所以进程之间要通信必须通过内核。

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

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

相关文章

数据结构之——队列详解

目录 前言&#xff1a; 一、什么是队列 二、队列的实现 2.1 队列结构 2.2 队列初始化 2.3 队列销毁 2.4 入队列 2.5 出队列 2.6 获取队列头部元素 2.7 获取队列尾部元素 2.8 获取队列中有效元素个数 2.9 检测队列是否为空 三、 代码总览 Queue.h test.c 四、例题 前言…

Base64在线编码解码方法

Base64在线编码解码 打开网站 在线工具网-梦幻加菲猫 选择“Base64编码解码” 输入需要编码/解码的内容&#xff0c;点击“编码”/“解码”按钮 编码&#xff1a; 解码&#xff1a; 4. 复制已经编码/解码后的内容。

大数据交通行政执法监测系统

交通行政执法监测系统应用系统按照监测主体可分为&#xff1a;出租车交通违法监测&#xff0c;客车交通违法监测&#xff0c;货车、危化品车辆交通违法监测&#xff0c;非法营运车辆监测。功能模块涵盖&#xff1a;特征识别、档案查询、预警分析等。 &#xff08;1&#xff09;…

腾讯云服务器之ssh远程连接登录及转发映射端口实现内网穿透(实现服务器访问本地电脑端口)

目录 一、创建密钥绑定实例二、设置私钥权限三、ssh远程连接到服务器四、修改root密码五、端口转发&#xff08;实现服务器访问本地电脑的端口&#xff09; 一、创建密钥绑定实例 创建密钥会自动下载一个私钥&#xff0c;把这个私钥复制到c盘 二、设置私钥权限 1、删除所有用户…

前端笔记-day04

文章目录 01-后代选择器02-子代选择器03-并集选择器04-交集选择器05-伪类选择器06-拓展-超链接伪类07-CSS特性-继承性08-CSS特性-层叠性09-CSS特性-优先级11-Emmet写法12-背景图13-背景图平铺方式14-背景图位置15-背景图缩放16-背景图固定17-background属性18-显示模式19-显示模…

NPOI生成word浮动图标

1、NPOI版本2.7.0, net框架4.8 2、安装OpenXMLSDKToolV25.msi 3、先创建一个word文档&#xff0c;并设置图片为浮于文字之上 4、OpenXML显示的结果 5、实际代码如下&#xff1a; public class GenerateWordDemo {public GenerateWordDemo(){}//https://blog.fileformat.co…

word-排版文本基本格式

1、文本的基本格式&#xff1a;字体格式、段落格式 2、段落&#xff1a;word排版的基本控制单位 3、每敲一次回车&#xff0c;为一个段落标记&#xff0c;注意区分换行符和段落标记&#xff0c;换行符为指向下的箭头&#xff0c;段落标记为带拐弯的箭头&#xff0c;换行符&…

C语言基础——循环语句

&#x1f33a;​&#x1f64f;&#x1f64f;&#x1f64f;欢迎大家观看&#xff0c;写的好的话希望三连感谢&#x1f64f;&#x1f64f;&#x1f64f;&#x1f33a; 文章目录 一、循环语句的介绍 二、不同循环语句的使用 1.while循环 1.1 while循环的使用方式 1.2 while循环的执…

Java | Leetcode Java题解之第84题柱状图中最大的矩形

题目&#xff1a; 题解&#xff1a; class Solution {public int largestRectangleArea(int[] heights) {int n heights.length;int[] left new int[n];int[] right new int[n];Arrays.fill(right, n);Deque<Integer> mono_stack new ArrayDeque<Integer>();f…

https免费证书获取

获取免费证书的网址&#xff1a; Certbot 1. 进入你的linux系统&#xff0c;先安装snapd&#xff0c; yum install snapd 2. 启动snapd service snapd start 3.安装 Certbot snap install --classic certbot 注意如下出现此错误时&#xff0c;需要先建立snap 软连接后&am…

MVCC 详解

介绍 MVCC&#xff0c;全称 Multi-Version Concurrency Control&#xff0c;即多版本并发控制 MVCC的目的主要是为了提高数据库并发性能&#xff0c;用更好的方式去处理读-写冲突&#xff0c;做到即使有读写冲突时&#xff0c;也能做到不加锁。 这里的多版本指的是数据库中同时…

Ubuntu 和 Windows之间无法复制粘贴问题解决方法

需要安装open-vm-tools&#xff0c;官方安装open-vm-tools的网址&#xff1a;安装 Open VM Tools (vmware.com)

vue 点击平滑到指定位置并绑定页面滑动效果

1.html元素 写出对应的数据块&#xff08;注意添加ref) 用于获取元素位置 <template><div class"index-page" ><div class"top-head" ref"index"><img src"logo.png" style"height: 40px;margin-right: 2…

代码+视频,R言语处理数据中的缺失值

在SCI论文中&#xff0c;我们不可避免和缺失数据打交道&#xff0c;特别是在回顾性研究&#xff0c;对于缺失的协变量&#xff08;就是混杂因素&#xff09;&#xff0c;我们可以使用插补补齐数据&#xff0c;但是对于结局变量和原因变量的缺失&#xff0c;我们不能这么做。部分…

网络端口占用问题的综合调研与解决方案

原创 Randy 拍码场 问题背景 去年底信息安全团队进行网络权限治理&#xff0c;要求所有应用实例使用静态IP&#xff0c;公网访问策略与静态IP绑定&#xff1b;之后实例重启时偶现“端口被占用”错误。通过分析总结应用日志&#xff0c;共有以下4种错误类型&#xff0c;实质都是…

WAAP全站防护理念,发现和保护敏感数据

数据是现代企业的新石油&#xff1a;正确使用它可以促进公司的发展并帮助企业在竞争中领先。就像石油一样&#xff0c;原始数据和未被发现的数据是毫无用处的&#xff0c;企业将无法从中受益&#xff1b;在最坏的情况下&#xff0c;它可能会导致安全事件。这也是企业投资敏感数…

MySQL数据库的初始化(创建库、创建表、向数据库添加测试数据)

MySQL数据库的初始化&#xff08;创建库、创建表、向数据库添加测试数据&#xff09; MySQL数据库简介MySQL创建一个新的数据库MySQL创建一张新的数据表简单&#xff08;设置&#xff09;表复杂&#xff08;设置&#xff09;表 填充测试数据SQL语句mysql>模式下输入的每句sq…

Spring Cloud | “微服务“ 架构 与 Spring Cloud

“微服务” 架构 与 Spring Cloud 目录: "微服务" 架构 与 Spring Cloud1. 认识架构"单体" 架构"SOA" 架构"微服务" 架构 2. "微服务架构" 的功能 :① 微服务架构的 "自动化部署"② 服务 "集中化管理"③…

PostgreSQL的学习心得和知识总结(一百四十三)|深入理解PostgreSQL数据库之Support event trigger for logoff

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

转载:ubuntu18.04 安装wine以及添加mono和gecko打开简单.net应用的方法

https://www.cnblogs.com/jinanxiaolaohu/p/12191576.html 1. 今天突然想试试能不能用ubuntu跑一下公司的.net的智能客户端(SmartClient). 想到的办法就是 安装wine 但是过程略坑..这里简单说一下总结之后的过程. 2. 第一步安装wine相关内容 查了下有winehq和wine两种. …