代码编织梦想

1.常见的通信方式

  1. 文件:进程间可以经由fork,exec以及文件系统传送文件。
  2. 管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
  3. 命名管道FIFO:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
  4. 消息队列MessageQueue:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
  5. 共享存储SharedMemory:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
  6. 信号量Semaphore:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
  7. 信号Signal : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
  8. unix域套接字:unix域套接字用于在同一台计算机上运行的进程之间的通信,其可以在两个进程间传送打开文件描述符。
  9. 套接字Socket:套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。

2.低级IPC方法

文件

进程间通信可以通过传送打开文件(fork,exec与文件系统)来实现,不同的进程通过一个或多个文件来传递信息,事实上,在很多应用系统里,都使用了这种方法。但一般说来,进程间通信不包括这种似乎比较低级的通信方法。

3.常用于本机的IPC机制

3.1管道(无名管道)

特点:
它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。

它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。

它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中

管道的实质是一个内核缓冲区,进程以先进先出的方式从缓冲区存取数据:管道一端的进程顺序地将进程数据写入缓冲区,另一端的进程则顺序地读取数据,该缓冲区可以看做一个循环队列,读和写的位置都是自动增加的,一个数据只能被读一次,读出以后再缓冲区都不复存在了。当缓冲区读空或者写满时,有一定的规则控制相应的读进程或写进程是否进入等待队列,当空的缓冲区有新数据写入或慢的缓冲区有数据读出时,就唤醒等待队列中的进程继续读写。

无名管道由pipe()函数创建:

#include <unistd.h>
int pipe(int filedis[2])

参数filedis返回两个文件描述符:filedes[0]为读而打开,filedes[1]为写而打开。filedes[1]的输出是filedes[0]的输入。

3.2FIFO(命名管道)

命名管道和无名管道的主要区别在于,命名管道有一个名字,命名管道的名字对应于一个磁盘索引节点,有了这个文件名,任何进程有相应的权限都可以对它进行访问。

而无名管道却不同,进程只能访问自己或祖先创建的管道,而不能访任意访问已经存在的管道——因为没有名字。

Linux中通过系统调用mknod()或makefifo()来创建一个命名管道。最简单的方式是通过直接使用shell。

mkfifo myfifo
mknod myfifo p

3.3消息队列MessageQueue

消息队列,就是一个消息的链表,是一系列保存在内核中消息的列表。用户进程可以向消息队列添加消息,也可以向消息队列读取消息。

消息队列与管道通信相比,其优势是对每个消息指定特定的消息类型,接收的时候不需要按照队列次序,而是可以根据自定义条件接收特定类型的消息。

消息队列的缺点是没有引用计数,如果进程创建了一个消息队列,并在该队列中放入了几条消息,之后终止,那么该消息队列的内容不会被删除。(APUE第450页)

3.4共享存储SharedMemory

共享内存有两种实现方式:1、内存映射 2、共享内存机制,其允许两个或多个进程共享一个给定的存储区,这一段存储区可以被两个或两个以上的进程映射至自身的地址空间中,一个进程写入共享内存的信息,可以被其他使用这个共享内存的进程,通过一个简单的内存读取错做读出,从而实现了进程间的通信。

采用共享内存进行通信的一个主要好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝,对于像管道和消息队里等通信方式,则需要再内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次:一次从输入文件到共享内存区,另一次从共享内存到输出文件。

使用共享存储来实现进程间通信的注意点是对数据存取的同步,必须确保当一个进程去读取数据时,它所想要的数据已经写好了。通常,信号量被要来实现对共享存储数据存取的同步。

在这里插入图片描述

3.5信号量Semaphore

信号量(semaphore)与已经介绍过的 IPC 结构不同,它是一个计数器。信号量用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。

Linux 下的信号量函数都是在通用的信号量数组上进行操作,而不是在一个单一的二值信号量上进行操作。

特点

  1. 信号量用于进程间同步,若要在进程间传递数据需要结合共享内存。
  2. 信号量基于操作系统的 PV 操作,程序对信号量的操作都是原子操作。
  3. 每次对信号量的 PV 操作不仅限于对信号量值加 1 或减 1,而且可以加减任意正整数。
  4. 支持信号量组。

3.6信号Signal

概念:

  1. 信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式。
  2. 信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些系统事件。
  3. 如果该进程当前并未处于执行态,则该信号就由内核保存起来,直到该进程恢复执行再传递给它;如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程。

用户进程对信号的响应方式

  1. 忽略信号:对信号不做任何处理,但是有两个信号不能忽略:即SIGKILL及SIGSTOP。
  2. 捕捉信号:定义信号处理函数,当信号发生时,执行相应的处理函数。
  3. 执行缺省操作:Linux对每种信号都规定了默认操作。

3.7unix域套接字

UNIX域套接字,需要一个进程作为服务器端,一个进程作为客户端,使用方法有点像socket网络,但又不经过网络底层的那些东西。与网络编程最不一样的地方是服务器端bind的时候用的是sockaddr_un结构,客户端connect的时候用的也是sockaddr_un结构,而不是sockaddr_in或sockaddr。

4.不同计算机上的IPC机制

套接字Socket

套接口(socket)编程是实现不同计算机中进程间通信的主要方式之一。我们熟知的WWW服务、FTP服务、TELNET服务等都是基于套接口编程来实现的。除了在异地的计算机进程间以外,套接口同样适用于本地同一台计算机内部的进程间通信。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/TABE_/article/details/117130490

进程间通信(ipc机制)精炼详解_chin_style的博客-爱代码爱编程_ipc机制

一、前期基础知识储备 IPC定义:IPC是Inter-Process Communication的缩写,含义为进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程。IPC不是Android所独有的,任何一个操作系统都需要有相应的IPC机制,比如Windows上可以通过剪贴板、管道和邮槽等来进行进程间通信,而Linux上可以通过命名共享内容、信号量

进程间通信的五种方式_yuebaii的博客-爱代码爱编程_进程间的通信方式有

进程间通信的意思就是在不同进程之间传递信息。它是一组编程接口,让程序员协调不同进程,使能够相互传递消息。 IPC目的 1)数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。 2)共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。 3)通知事件:一个进程需要向另一个或一组进程发送

几种常见进程间通信(ipc)方式之共享存储_lynalmost的博客-爱代码爱编程_进程间通信的地址

几种常见进程间通信(IPC)方式-共享存储 前言 进程间通信是指在不同进程之间传播或交换信息,在Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间,进程之间不能相互访问。必须通过内核才能进行数据交换

进程通信ipc_下家山的博客-爱代码爱编程

  进程通信IPC                    作者:下家山 一:管道popen 我们在学习进程的时候,看到一种在两个进程间发送消息的非常简单的方法:使用信号量。我们创建通知事件,通过它引起响应,但传送的信息只限于一个信号值。 在本章,我们将介绍管道,通过它进程之间可以交换更有用的数据。 1.1 什么是管道 当一个进程链接数据流到另

ipc进程之间通信的几种方式-爱代码爱编程

概念         进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是 共享内存区 。但是,系统空间却是“公共场所”,所以内核显然可以提供这样的条件。         除此以外,那就是双方都可以访问的 外设 了。在这个意义上,两个进程当然也可

进程间通讯的7种方式_zhaohong_bo的博客-爱代码爱编程_进程间的通信方式有

1、常见的通信方式 管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。命名管道FIFO:有名管道也是半双工的通信方式,但是它允许无亲缘关系进

进程间通信(IPC)-爱代码爱编程

进程间通信(Interprocess communication)一、概述: 进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是共享内存区。进程间通信是一组编程接口,让程序员能够协调不同的进程,使之能在一个操作系统里同时运行,并相互传递、交换信息。这使得一个程序能够在同一时间里处理许多用户的要求。因为即使只有一个用户发出要求,也可能

进程间通信(IPC -- InterProcess Communication)的五种方式-爱代码爱编程

目录 0. 前言1. 管道通信(Pipe)2. 消息队列(Queue)3. 共享内存4. 信号量(信号灯集)5. socket套接字 0. 前言 0.1 进程间通信的必要性 进程间空间独立,资源不共享,此时若需要在进程间数据传输,就需要用特定的手段进行数据通信。 0.2 常用的进程间通信方式 (1)管道(拓展:命名管道);(2)消息队列;(

IPC的几种方式的使用方法和应用-爱代码爱编程

IPC IPC即Inter-Process Communication,进程间通信的意思。顾名思义,可以在不同的进程间进行通信,可以理解为传递信息。当然,信息包括文本信息和信号等。因此,最简单的通信方式便是信号和管道。说简单,是因为这两者都是进程级的,随着进程的消失而消失,而本次主要介绍的是除了管道和信号之外的其他一些通信方式,比如信号量,消息队列,共享

进程间通信 六种IPC方式详解-爱代码爱编程

进程间通信(IPC)详解IPC 单机形式有管道(无名管道 和 FIFO)、消息队列、共享内存、信号、信号量。多机形式有socket、streams。 查看系统中的消息队列、共享内存、信号量的命令: ipcs 删除指令 ipcrm -m "id" //删除共享内存 ipcrm -s "id" //删除信号量 ipcrm -q "id"