进程间通信 IPC(Inter-Process Communication)

目录

  • 一、管道
  • 二、FIFO
  • 三、消息队列
  • 四、信号量
  • 五、共享存储
  • 六、网络IPC:套接字

一、管道

管道是进程间通信中最古老的方式,所有UNIX都提供此种通信机制。管道有以下两种局限性:

  1. 历史上,他们是半双工的(即数据只能在一个方向上流动)。
  2. 管道只能在具有公共祖先的两个进程间使用。通常,一个管道由一个进程创建,在进程调用fork之后,这个管道就能在父进程和子进程之间使用了。

FIFO没有第二种局限性。

尽管有这两种局限性,半双工管道仍然是最常用的IPC形式。

管道由pipe()函数创建:

#include <unistd.h>
int pipe(int fd[2]);  返回值:若成功,返回0,若出错,返回-1
参数fd返回两个文件描述符:fd[0]为读而打开,fd[1]为写而打开。fd[1]的输出是fd[0]的输入。

通常,进程会先调用pipe,接着调用fork,从而创建从父进程到子进程的IPC通道,反之亦然。fork之后做什么取决于我们想要的数据流的方向。

对于从父进程到子进程的管道:父进程关闭管道的读端(fd[0]),子进程关闭写端(fd[1])。

对于从子进程到父进程的管道:父进程关闭管道的写端(fd[1]),子进程关闭读端(fd[0])。

二、FIFO

FIFO有时被称为命名管道,通过FIFO,不相关的进程也能交换数据。

FIFO由mkfifo()函数创建:

#include <sys/stat.h>
int mkfifo(const char *path, mode_t mode);   返回值:若成功,返回0,若出错,返回-1

FIFO有如下两种用途:

  1. shell命令使用FIFO函数将数据从一条管道传送到另一条时,无需创建中间临时文件。
  2. 客户进程-服务器进程应用程序中,FIFO用作汇聚点,在客户进程和服务器进程二者之间传递数据。

三、消息队列

消息队列是消息的链接表,存储在内核中,由消息队列标识符标识。

客户进程和服务器进程之间的双向数据流。

msgget用于创建一个新队列或打开一个现有队列,msgsnd将新消息添加到队列尾端,每个消息包含一个正的长整型类型的字段、一个非负的长度(nbytes)以及实际数据字节数(对应于长度),msgrcv用于从队列中取消息。

#include <sys/msg.h>
int msgget(key_t key, int flag);  返回值:若成功,返回消息队列ID,若出错,返回-1
int msgsnd(int msgid, const void *ptr, size_t nbytes, int flag);  返回值:若成功,返回0,若出错,返回-1
ssize_t msgrcv(int msqid, void *ptr, size_t nbytes, long type, int flag);  返回值:若成功,返回消息数据部分的长度,若出错,返回-1

四、信号量

本质上,信号量是一个计数器,用于为多个进程提供对共享数据对象的访问。

维护信号量状态的是Linux内核操作系统而不是用户进程。

一般说来,为了获得共享资源,进程需要执行下列操作:

  1. 测试控制该资源的信号量。
  2. 若此信号量的值为正,则允许进行使用该资源。进程将信号量减1。
  3. 若此信号量为0,则该资源目前不可用,进程进入睡眠状态,直至信号量值大于0,进程被唤醒,转入步骤(1)。
  4. 当进程不再使用一个信号量控制的资源时,信号量值加1。如果此时有进程正在睡眠等待此信号量,则唤醒此进程。

五、共享存储

共享存储允许两个或多个进程共享一个给定的存储区。因为数据不需要在客户进程和服务器进程之间复制,所以这是最快的一种IPC。

通常,信号量被用来实现对共享存储数据存取的同步。(也可以用记录锁或互斥量)

shmget获得一个共享存储标识符,shmctl对共享存储段执行多种操作,shmat将共享存储段连接到它的地址空间。

#include<sys/shm.h>
int shmget(key_t key, size_t size, int flag); 返回值:若成功,返回共享存储ID;若出错,返回-1
int shmctl(int shmid, int cmd, struct shmid_ds *buf); 返回值:若成功,返回0;若出错,返回-1
void *shmat(int shmid, const void *addr, int flag); 返回值:若成功,返回指向共享存储段的指针;若出错,返回-1

六、网络IPC:套接字

不同计算机(通过网络相连)上的进程相互通信的机制:网络进程间通信(network IPC)。

套接字是通信端点的抽象。正如使用文件描述符访问文件,应用程序用套接字描述符访问套接字。

socket创建一个套接字,shutdown禁止一个套接字的I/O。

#include <sys/socket.h>
int socket(int domain, int type, int protocol);  返回值:若成功,返回文件(套接字)描述符,若出错,返回-1
int shutdown(int sockfd, int how);  返回值:若成功,返回0,若出错,返回-1

原文地址:https://www.cnblogs.com/zengzhihua/p/9913186.html

时间: 2024-10-31 19:29:43

进程间通信 IPC(Inter-Process Communication)的相关文章

【操作系统之三】Linux下进程间通信-IPC(Inter-Process Communication)

管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信:信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身:linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够

c# 进程间通信 IPC

最近在调试一个算法,想通过改变算法的参数看看结果有什么变化. 碰到一个麻烦的事情是,从磁盘加载.构建数据需要15分钟.这就比较讨厌了,也就是说我每次调一个参数前都要等15分钟启动时间? 于是我就想,能不能开一个datahost进程专门加载数据.我在别的进程调试参数,但需要用数据时就直接从datahost进程中加载现成的数据. 这样的话我只需要从磁盘加载一次数据. 于是找了一下, c#有个叫IPC(inter process communication)的功能可以实现同一台机器上的不同进程间通信.

进程间通信(IPC)之消息队列

★IPC方法包括管道(PIPE).消息队列(Message_Queue).旗语.共用内存(ShareMemory)以及套接字(Socket).进 程间通信主要包括了管道.系统IPC(包括了消息队列.信号以及共享存储).套接字(SOCKET).此文将详细叙述消息队列的相 关内容. ★产生原因: 所谓消息队列,其实就是消息(数据)传输过程中保存的容器.既然有了管道通信的方式,何必又有消息队列呢? 因为根据管道的特性,我们知道其在一定程度上存在或多或少的局限性,首先匿名管道以及命名管道是随进程的,进

Android中进程间通信(IPC)方式总结

IPC为进程间通信或跨进程通信,是指两个进程进行进程间通信的过程.在PC和移动设备上一个进程指的是一个程序或者一个应用,所以我们可以将进程间通信简单理解为不同应用之间的通信,当然这种说法并不严谨. 在Android中,为每一个应用程序都分配了一个独立的虚拟机,或者说每个进程都分配一个独立的虚拟机,不同虚拟机在内存分配上有不同的地址空间,这就导致在不同的虚拟机互相访问数据需要借助其他手段.下面分别介绍一下在Android中进行实现IPC的方式. 1.使用Bundle 我们知道在Android中三大

进程间通信IPC之--共享内存

每个进程各自有不同的用户地址空间,任何一个进 程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲 区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication) 如下图所示: 进程间通信共七种方式: 第一类:传统的unix通信机制: # 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲

[原创]chromium源码阅读-进程间通信IPC.消息的接收与应答

chromium源码阅读-进程间通信IPC.消息的接收与应答 chromium源码阅读-进程间通信IPC.消息的接收与应答 介绍 chromium进程间通信在win32下是通过命名管道的方式实现的,最后的数据都是以二进制流的方式进行传播,pickle类就是负责消息的封包与解包功能,它将各种数据已二进制的形式写到内存缓冲区中,在实际通信的时候通过与其他一些辅助类与模板函数来实现具体数据结构的写与读.本文主要介绍的是chromium在将消息发送与接收过程中,以及chromium如何通过各种消息宏与C

UnixC——进程间通信(IPC)

一.进程间通信(IPC):Unix / Linux 系统基于多进程,进程和进程之间数据的交互. 1.常见的IPC:1)文件    2)信号    3)管道(FIFO)    4)共享内存    5)消息队列    6)信号量集    7)网络编程(socket) 2.共享内存.消息队列和信号量集遵循相同的规范,统称为 XSI IPC. ------------------------------------------ 二.管道:一种仅做为交互媒介的IPC的特殊的文件,不存储任何的数据,文件名后

进程间通信---IPC对象 之 消息队列

IPC对象,既我们所说的进程间通信,下面就来总结一下都有哪些方式以及怎么使用. 一 消息队列 1 消息队列的创建: int msgget(key_t key, int msgflg); 功能:获取指定的key值的消息队列ID 参数: @key <1>IPC_PRIVATE:每次都会创建一个新的消息队列 [用在亲缘关系的进程间痛惜] <2>ftok函数获的key [用在非亲缘关系进程间通信] key_t ftok(const char *pathname, int proj_id);

Linux 进程间通信(IPC)

Linux 进程间通信(IPC): Linux系统中除了进程和进程之间通信,我想大家也应该关注用户空间与内核空间是如何通信的,比方说netlink等等.除了传统进程间通信外像Socket通信也需要掌握的! /*-------------------------------------------------------------------------- * Project: aipc.c * Name: zwp * Date: 2014/6 *------------------------