管道通信

Linux 进程间通信方式和原理

孤街浪徒 提交于 2020-02-13 15:31:26
Linux 进程间通信方式和原理 进程间的通信方式 进程的概念 进程时操作系统的概念,每当我们执行一个程序时,对于操作系统来讲究创建了一个进程,在这个过程中,伴随着资源的分配和释放。可以认为进程时是一个程序的一次执行过程。 进程通信的概念 进程用户空间是相互独立的,一般而言是不能相互访问的。但很多情况下进程间需要相互通信,来完成系统的某项功能。进程通过与内核及其他进程之间的互相通信来协调它们的行为 进程通信的应用场景 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。 共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。 资源共享:多个进程之间共享同样的资源。为了做到这一点,需要内核提供锁和同步机制。 进程控制:有些进程希望完全控制另一个进程的执行,此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。 进程通信的方式 管道(pipe) 普通管道:通常有两种限制,一是单向传输,二是智能在父子或者兄弟进程间使用。 流管道:去除了第一种限制,为半双工,只能在父子或兄弟进程间使用,可以双向传输。 命令管道:去除了第二种限制,可以在许多并不相关的进程之间进行通信。 信息量

IPC通信_无名管道(PIPE)

十年热恋 提交于 2020-02-02 23:56:30
无名管道只能在具有公共祖先的两个进程间使用,且建议半双工使用 ( 因为历史上就是半双工,虽然有些系统支持全双工管道 ) 。 无名管道通过 pipe 函数创建 #include <unistd.h> int pipe(int fd[2]); 其中:参数 fd 返回两个文件描述符, fd[0] 只用来读,是输出 ,fd[1] 只用来写,是输入。 举例: #include <fcntl.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> // linux支持双通道? int main() { int fd[2]; int pid = 0; int n = 0; char buf[128] = {0}; if(pipe(fd) < 0) { printf("pipe failed\n"); return -1; } if(pid = fork() == 0) {// 子进程 printf("child print\n"); close(fd[0]); write(fd[1],"hello,this is child\n",40); } else {// 父进程 printf("father print\n"); close(fd[1]); n = read(fd[0],buf,sizeof(buf)); if(n >

linux之间进程通信

扶醉桌前 提交于 2020-02-02 00:17:47
进程间通信方式: 同主机进程间数据交换机制: pipe(无名管道) / fifo(有名管道)/ message queue(消息队列)和共享内存。 必备基础: fork() 创建一个与之前完全一样的进程,这两个进程执行没有固定的先后顺序,哪个进程先执行要看系统的进程调度策略。 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都 复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。    vfork : 与fork用法相同,但是他和父进程共享同样的数据存储,因此无需完全复制父进程的地址空间。 // fork() study example 1#include <unistd.h> #include <stdio.h> int main () { pid_t fpid; //fpid表示fork函数返回的值 int count=0; // fork 会将这个变量存在两个不同的内存中,所以两次count的值都是 1 ,而不是 1,2 。 fpid=fork(); if (fpid < 0) printf("error in fork!"); else if (fpid == 0) { printf("i am the child process, my process id is %d、n",getpid(

进程间通信

与世无争的帅哥 提交于 2020-01-30 11:34:38
进程间通信原因 因为每一个进程都是拥有一个独立的虚拟地址空间的,促使进程独立,导致了进程之间需要协作。 进程间通信分为 数据传输-----管道,消息队列 数据共享-----共享内存 进程控制-----信号量 首先先谈谈管道和共享内存 管道 ---匿名管道,命名管道 本质:管道其实就是一块内存,是内核当中的缓冲区 匿名管道---没有标识 特性: 具有亲缘关系的进程间通信 半双工,数据只能有一个流向 提供字节流服务 自带同步与互斥功能 生命周期随进程,进程终止,生命周期消失 如果管道为空,则读阻塞 如果管道为满,则写阻塞 如果管道的读端被关闭,则写端往管道当中写数据的时候,会造成管道破裂,并且导致进程收到SIGPIPE信号,从而进程终止 如果管道的写端被关闭掉了,则读端读完管道的数据之后,read不会陷入阻塞状态,而是返回。执行代码剩下的正常流程 管道大小PIPE_SIZE:64K,PIPE_BUG:4K 如果写入的数据大于PIPE_BUG的话,则不保证写入数据的原子性 原子性:当前操作不被打断,换句话说,在管道的读写操作是不可以被打断的 临界资源:同一时间,当前资源只能被一个进程所访问 互斥:同一时间,保证只能有一个进程访问临界资源 同步:保证临界资源访问的合理性 创建一个管道(亲缘关系的进程中使用) int pipe(int pipefd[2]); pipefd[0]

进程间通信小结

瘦欲@ 提交于 2020-01-29 02:04:28
进程间通信: 1、进程间的数据共享: 管道、 消息队列、 共享内存、 Unix域套接字 易用性: 消息队列 > Unix域套接字 > 管道 > 共享内存(经常与信号量一起用) 效 率: 共享内存 > Unix域套接字 > 管道 > 消息队列 常 用: 共享内存、Unix域套接字 2、异步通信 信号 3、同步与互斥(做资源保护) 信号量 来源: https://www.cnblogs.com/y4247464/p/12239464.html

进程间通信

試著忘記壹切 提交于 2020-01-28 07:53:03
【进程间通信】 进程间由于空间独立,资源互相无法直接获取 此时在不同的进程间传递数据就需要专门的进程间通信方法 和磁盘交互: 使用中间文件,但是不安全,速度慢 进程间通信方法(IPC): 管道、消息队列、共享内存、信号、信号量、套接字 【管道通信Pipe】 1.原理: 在内存中开辟一块空间,形成管道结构,管道对多个进程可见,进程可以通过对管道的读写操作进行通信 2.[multiprocessing.Pipe] 1.fd1,fd2 = Pipe(duplex=True) 功能:创建一个管道 参数: duplex默认为True 表示双向管道 设置为False 表示单项管道 返回值: 返回两个管道流对象,表示管道两端 如果是双向管道,则都可以读写 如果是单向管道,则fd1只读 fd2只写 2.fd1.recv() 功能:从管道内读取信息 参数:无 返回值:读到的内容 注意:当管道内无内容的时候会阻塞 3.fd2.send(data) 功能:向管道写入内容 参数:要写的内容 注意:可以发送几乎python的任意数据类型 3.示例(双向管道): from multiprocessing import Process,Pipe import os,time # 创建管道 fd1,fd2 = Pipe() def fun(name): time.sleep(3) # 向管道内写入内容 fd2

Linux课程设计报告【全集】

杀马特。学长 韩版系。学妹 提交于 2020-01-26 06:45:32
4个题目:进程创建及创建过程分析、进程族亲关系分析、进程间软中断通信、进程间管道通信 (欢迎评论/私信) 笔者用的是“ProcessOn免费在线作图网站”作的图。 报告格式要求:正文{中文:宋体、五号、单倍距;英文:Times New Roman、11号、单倍距} 一级标题{宋体、小三号、加粗} 二级标题{四号} 三级标题{小四} 不允许有四级标题 图命名{在图下方居中、宋体、五号、 仅允许出现2级图名 eg.3-1<空格>名称} 图中文字{宋体、小五} 表命名{在表上方居中、......} 表中文字{......} 页眉{学号<空格>姓名、宋体、小四、居中} 页脚{目录页码用罗马数字、正文页码用阿拉伯数字} 注* 参考文献格式要求、缩进要求 题目1 进程创建及创建过程分析 参看书P163~166 1.1设计目的 灵活运用fork系统调用创建进程,深入分析进程创建过程及fork系统调用返回值的含义,透彻分析父子进程代码共享、执行流程及数据集合的变化轨迹。 1.2设计要求 设计的程序能体现出父子进程执行轨迹的差别,也能体现出父子进程数据集合的差别。 1.3程序源代码 #include<stdio.h> #include<unistd.h> pid_t fork(void); int main() { printf("parent pid=%d\n",getpid()); pid_t

进程间通信二:管道技术之输入输出重定向

。_饼干妹妹 提交于 2020-01-26 06:10:23
转载自: http://blog.csdn.net/morewindows/article/details/7390350 本篇将介绍 输入输出的重定向问题, 先来看一个小小的实例,设有一个程序,该程序的输入输出为标准输入输出即从键盘上输入,输出到屏幕。现在要重定向输入法输出,使程序从文件中读取数据,处理后输出到文件。程序代码如下(称此程序为示例程序): [cpp] view plain copy #include <stdio.h> int main() { int n; while (scanf( "%d" , &n) != EOF) //标准输入时,可按ctrl+z来输入EOF { n *= 2; printf( "%d\n" , n); } } 试给出几种不同的实现方法,另外如果没有程序代码,只有可执行文件,又应该如何做了? 实现方法一使用C语言的freopen()函数 函数功能:重定向控制台的输入输出 函数原型: FILE * freopen ( const char * path , const char * mode , FILE * stream ); 函数说明: 第一个参数为文件指针(也可以用来指向标准输入输出)。 第二个参数为打开方式, "w" 表示 写, "r" 表示 读, "a" 表示 追加。其它设置可以参考 MSDN 。 第三个参数为 FILE 类型的指针

Windows进程间通信

假装没事ソ 提交于 2020-01-21 20:07:27
  Microsoft Win32应用编程接口(Application Programming Interface, API)提供了大量支持应用程序间数据共享和交换的机制,这些机制行使的活动称为进程间通信(InterProcess Communication, IPC),进程通信就是指 不同进程间进行数据共享和数据交换 。进程间通信的方式有: 1、文件映射   文件映射(Memory-Mapped Files)能使进程把文件内容当作进程地址区间一块内存那样来对待。因此,进程不必使用文件I/O操作,只需简单的指针操作就可读取和修改文件的内容。   Win32 API允许多个进程访问同一文件映射对象,各个进程在它自己的地址空间里接收内存的指针。通过使用这些指针,不同进程就可以读或修改文件的内容,实现了对文件中数据的共享。 应用程序有三种方法来使多个进程共享一个文件映射对象:   (1)继承:第一个进程建立文件映射对象,它的子进程继承该对象的句柄。   (2)命名文件映射:第一个进程在建立文件映射对象时可以给该对象指定一个名字(可与文件名不同)。第二个进程可通过这个名字打开此文件映射对象。另外,第一个进程也可以通过一些其它IPC机制(有名管道、邮件槽等)把名字传给第二个进程。   (3)句柄复制:第一个进程建立文件映射对象,然后通过其它IPC机制(有名管道、邮件槽等

进程同步与通信

倾然丶 夕夏残阳落幕 提交于 2020-01-21 00:06:55
进程同步与通信 操作系统教程: http://c.biancheng.net/cpp/html/2592.html 进程的同步与互斥是指进程在推进时的相互制约关系。 # 进程同步 :它主要源于进程合作,是进程间共同完成一项任务时直接发生相互作用的关系。为进程之间的直接制约关系。如生产者-消费者问题,哲学家进餐问题。 # 进程互斥 :它主要源于资源共享,是进程之间的间接制约关系。在多道系统中,每次只允许一个进程访问的资源称为临界资源,进程互斥就是保证每次只有一个进程使用临界资源。如访问控制台、打印机。 为禁止两个进程同时进入临界区,同步机制应遵循以下准则: 空闲让进:临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区。 忙则等待:当已有进程进入临界区时,其他试图进入临界区的进程必须等待。 有限等待:对请求访问的进程,应保证能在有限时间内进入临界区。 让权等待:当进程不能进入临界区时, 应立即释放处理器,防止进程忙等待 。 进程同步和互斥在不同的系统中有不同的实现。 Windows中的进程同步方法有信号量、事件,互斥方法有临界区、互斥锁。 Linux中的进程同步方法有?? 互斥方法有?? 信号量是一种功能较强的机制, 可用来解决互斥与同步 的问题,它只能被两个标准的原语wait(S)和signal(S)来访问,也可以记为“P操作”和“V操作”。 Wait 原语的实现 void