管道通信

进程间通信(IPC)

流过昼夜 提交于 2020-01-17 01:03:50
进程间通信(Interprocess communication) 一、概述: 进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是共享内存区。进程间通信是一组编程接口,让程序员能够协调不同的进程,使之能在一个操作系统里同时运行,并相互传递、交换信息。这使得一个程序能够在同一时间里处理许多用户的要求。因为即使只有一个用户发出要求,也可能导致一个操作系统中多个进程的运行,进程之间必须互相通话。IPC接口就提供了这种可能性。每个IPC方法均有它自己的优点和局限性,一般,对于单个程序而言使用所有的IPC方法是不常见的。 二、目的: (1)数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。 (2)共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。 (3)通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。 (4)资源共享:多个进程之间共享同样的资源。为了作到这一点,需要内核提供锁和同步机制。 (5)进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。 进程通过与内核及其它进程之间的互相通信来协调它们的行为。Linux支持多种进程间通信(IPC)机制

Java 多线程间的通讯

瘦欲@ 提交于 2020-01-13 20:32:26
问题 在前一小节,介绍了在多线程编程中使用同步机制的重要性,并学会了如何实现同步的方法来正确地访问共享资源。这些线程之间的关系是平等的,彼此之间并不存在任何依赖,它们各自竞争CPU资源,互不相让,并且还无条件地阻止其他线程对共享资源的异步访问。然而,也有很多现实问题要求不仅要同步的访问同一共享资源,而且线程间还彼此牵制,通过相互通信来向前推进。那么,多个线程之间是如何进行通信的呢? 解决思路 在现实应用中,很多时候都需要让多个线程按照一定的次序来访问共享资源,例如,经典的生产者和消费者问题。这类问题描述了这样一种情况,假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中的产品取走消费。如果仓库中没有产品,则生产者可以将产品放入仓库,否则停止生产并等待,直到仓库中的产品被消费者取走为止。如果仓库中放有产品,则消费者可以将产品取走消费,否则停止消费并等待,直到仓库中再次放入产品为止。显然,这是一个同步问题,生产者和消费者共享同一资源,并且,生产者和消费者之间彼此依赖,互为条件向前推进。但是,该如何编写程序来解决这个问题呢? 传统的思路是利用循环检测的方式来实现,这种方式通过重复检查某一个特定条件是否成立来决定线程的推进顺序。比如,一旦生产者生产结束,它就继续利用循环检测来判断仓库中的产品是否被消费者消费

linux各种IPC机制

别等时光非礼了梦想. 提交于 2020-01-13 19:50:47
linux各种IPC机制   docker中的资源隔离,一种就是IPC的隔离。IPC是进程间通信。 下面的文章转载自https://blog.csdn.net/yyq_9623/article/details/78794775 原帖发表在IBM的developerworks网站上,是一个系列的文章,作者郑彦兴,通过讲解和例子演示了Linux中几种IPC的使用方式,我觉得很好,在这里做一个保留,能看完的话Linux IPC的基础是没有问题的了。 一)Linux环境进程间通信(一)管道及有名管道 http://www.ibm.com/developerworks/cn/linux/l-ipc/part1/ 二)Linux环境进程间通信(二): 信号 上: http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index1.html 下: http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index2.html 三)Linux环境进程间通信(三)消息队列 http://www.ibm.com/developerworks/cn/linux/l-ipc/part3/ 四)Linux环境进程间通信(四)信号灯 http://www.ibm.com/developerworks

C++管道通信类封装

南笙酒味 提交于 2020-01-11 15:32:43
简单的介绍一下,管道通信类 指的是 IPC通信中的一种,即两个不同的进程之间的通信 现在实现一下管道通信类,方便以后调用使用 头文件(引用相关的库) // stdafx.h : 标准系统包含文件的包含文件, // 或是经常使用但不常更改的 // 特定于项目的包含文件 // # pragma once # include "targetver.h" # include <stdio.h> # include <tchar.h> # include <iostream> # include <Windows.h> # include <string> # include <memory> // TODO: 在此处引用程序需要的其他头文件 管道通信类的声明 # include "stdafx.h" enum PIPEUSERTYPE { USER_CLIENT , //客户端 USER_SERVER , //服务端 } ; //定义管道通信类 class PipeIPC { public : PipeIPC ( ) ; ~ PipeIPC ( ) ; bool InitPipeIPC ( std :: wstring pipe_name , PIPEUSERTYPE states ) ; //初始化管道通信 //读写数据 bool WriteData ( std :: string

进程间通信(一)

坚强是说给别人听的谎言 提交于 2020-01-10 03:40:06
进程间通信 一、进程间通信简介 1.进程间是相互独立的,每个进程都有自己的进程虚拟地址空间,二进程通讯需要介子,使得两个进程都能访问的公共资源; 2.进程间通讯的目的: 数据传输:一个进程需要将他的数据发送给另一个进程 资源共享:多个进程间共享同样的资源 通知事件:一个进程需要向另一个或一组进程发送消息,通知它们发生了某种事件(如子进程退出时要通知父进程回收其资源等) 进程控制:有些进程希望完全控制另一个进程的执行,此时控制进程希望能够拦截另一个进程所有陷入和异常,并能及时的知道他的改变状态 二、进程间通讯的发展及分类: 1.管道 匿名管道pipe 命名管道 2.System V进程间通讯 System V消息共享队列 System V共享内存 System V信号量 3.POSIX进程间通讯 消息队列 共享内存 信号量 互斥量 条件变量 读写锁 三、管道 1.什么是管道: 管道是内核中的一块内存 ,构成一个队列, 使用一对文件描述符来进行访问管理这个内存 ,读文件描述符相当于从这个内存中取数据,写文件描述符相当于往这块内存中写数据 2.匿名管道 匿名管道的创建 int pipe(int pipefd[2]); 功能:是创建一个无名管道; 参数:是两个输出型参数,fd表示文件描述符数组,其中fd[0]端表示读端,fd[1]端表示写端。 返回值:创建成功返回0;失败返回错误码。

进程通信之对象-无名管道

生来就可爱ヽ(ⅴ<●) 提交于 2020-01-10 00:06:34
无名管道(管道=队列):在系统中无不存在这样一个文件名 例子1:用pipe()函数创建一个无名管道,实现一个进程向管道中读写信息;建立no_name_pipe1.c内容如下 #include"unistd.h" #include"sdtio.h" #include"stdlib.h" #include"string.h" int main() { int fd[2]; int ret;//管道描述符 char write_buf[]="hellolinux!";//要向管道写入的信息 char read_buf[128]={0};//读缓存 ret=pipe(); if(ret<0) { printf("create a pipe failure\n"); return -1; } printf("create pipe succcess 写端fd[1]=%d ,读端fd[0]=%d\n",fd[1],fd[0]); //向管道写入信息 write(fd[1],write_buf,sizeof(write_buf)); //start read from pipe read(fd[0],read_buf,128); printf("read_buf=%s\n",read_buf); //关闭管道两端 close(fd[0]); close(fd[1]); return 0; }

Linux下进程中的通信(上)

给你一囗甜甜゛ 提交于 2020-01-04 19:23:31
一.进程通信的概念 为什么要进程通信? 进程通信:顾名思义,应该是两个进程间进行通信。 进程之间具有独立性,每个进程都有自己的虚拟地址空间,进程A不知道进程B的虚拟地址空间的数据内容(类似于一个人不知道另一个人脑子里在想啥) 二.进程间通信方式的分类 进程间通信方式的共同点: 进程间需要“介质”—两个进程都能访问到的公共资源。 常见的通信方式: 文件(最简单的方法) 假如用vim打开一个test.c文件,这时候会自动产生一个以文件名结尾的.swap文件,用于保存数据。 当正常关闭时,此文件会被删除。当文件非正常关闭时(比如编辑代码时突然断网),如果此时再次通过vim打开该文件,就会提示存在.swap文件,此时你可以通过它来恢复文件:vim -r filename.c 恢复以后把.swap文件删掉,就不会再出现一堆提示了。所以该文件存在就是为了进行进程中的通信。 管道 1.管道定义:一个进程连接到另一个进程的数据流。 ps aux | grep test ,将前一个进程(ps)的输出作为后一个进程(grep)的输入两进程间通过管道进行通信。 ps aux | -l :wc指word count,-l指行数,将ps aux进程的标准输出作为wc -l的标准输入。 2.管道分类 匿名管道和命名管道。 匿名管道 管道是在内核中的一块内存(构成了一个队列)

C# 管道通信 (client —— server)Framework2.0版本也可用

我是研究僧i 提交于 2020-01-01 20:11:57
//管道服务类public class PipServer { [DllImport("kernel32.dll", SetLastError = true)] public static extern SafeFileHandle CreateNamedPipe( String pipeName, //管道名 uint dwOpenMode,//管道类型 uint dwPipeMode,//管道参数 uint nMaxInstances,//管道能创建的最大实例数量 uint nOutBufferSize, //输出缓冲区长度 0表示默认 uint nInBufferSize,//输入缓冲区长度 0表示默认 uint nDefaultTimeOut,//超时时间 IntPtr lpSecurityAttributes);//指定一个SECURITY_ATTRIBUTES结构,或者传递零值 [DllImport("kernel32.dll", SetLastError = true)] public static extern int ConnectNamedPipe( SafeFileHandle hNamedPipe, IntPtr lpOverlapped); public const uint DUPLEX = (0x00000003); public const uint

Linux进程间通信

一曲冷凌霜 提交于 2020-01-01 16:10:02
写在前面 为什么 要进行进程间通信? 因为进程间具有独立性(每一个进程都有自己的虚拟地址空间,进程A并不知道进程B的虚拟地址空间中的内容),因此导致了进程之间协作的问题 进程间通信的 目的 : 数据传输:一个进程需要将它的数据发送给另一个进程 数据共享:多个进程间需要共享同样的数据、资源 进程控制:一个进程希望完全控制另一个进程的执行,此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变 进程间通信 分类 : 管道 System V IPC POSIX IPC 网络 是当前最大的进程间通信 本篇文章中只针对管道及System V中的共享内存、消息队列和信号量进行解释 管道 概念: 我们把从一个进程连接到另一个进程的一个数据流称为一个管道 管道是Unix中最古老的进程间通信的形式。它本质是一个内核中的内存,也可以将这块内存称为缓冲区,当其中的数据被读走后,管道就为空 管道是半双工的,即数据只能由一个流向 匿名管道 # include <unistd.h> int pipe(int fd[2]); 功能:创建一个匿名管道 参数:fd[]:文件描述符数组,fd[0]表示读端,fd[1]表示写端,使用这一对文件描述符访问内存 返回值:成功返回0,失败返回-1 【注】: 1、pipe()函数的参数是 输出型参数 ,也就是意味着需要传入一个int类型数组,数组大小为2

《Python》进程之间的通信(IPC)、进程之间的数据共享、进程池

倖福魔咒の 提交于 2019-12-26 03:41:17
一、进程间通信---队列和管道(multiprocess.Queue、multiprocess.Pipe)   进程间通信: IPC (inter-Process Communication) 1、队列 概念介绍:   创建共享的进程队列,Queue是多进程的安全的队列,可以使用Queue实现多进程之间的数据传递。 # Queue([maxsize]) 创建共享的进程队列。 参数 :maxsize是队列中允许的最大项数。如果省略此参数,则无大小限制。 底层队列使用管道和锁定实现。 # Queue([maxsize]) 创建共享的进程队列。maxsize是队列中允许的最大项数。如果省略此参数,则无大小限制。底层队列使用管道和锁定实现。另外,还需要运行支持线程以便队列中的数据传输到底层管道中。 Queue的实例q具有以下方法: q.get( [ block [ ,timeout ] ] ) 返回q中的一个项目。如果q为空,此方法将阻塞,直到队列中有项目可用为止。block用于控制阻塞行为,默认为True. 如果设置为False,将引发Queue.Empty异常(定义在Queue模块中)。timeout是可选超时时间,用在阻塞模式中。如果在制定的时间间隔内没有项目变为可用,将引发Queue.Empty异常。 q.get_nowait( ) 同q.get(False)方法。 q.put