[转] IPC之管道、FIFO、socketpair】的更多相关文章

IPC(InterProcess Communication,进程间通信)是进程中的重要概念.Linux 进程之间常用的通信方式有: 文件:简单,低效,需要代码控制同步 管道:使用简单,默认阻塞 匿名管道 pipe:只存在于内核缓冲区,只能用于有血缘关系的进程 有名管道 FIFO:在文件系统中存在,可用于无血缘关系的进程 信号量:使用复杂,但开销小,操作系统本身支持信号量 内存映射区 mmap:进程有无血缘关系都可以 本地套接字 socket:稳定可靠 管道概念 通过管道,可以把一个进程的输出作…
整理自网络 Unix IPC包括:管道(pipe).命名管道(FIFO)与信号(Signal) 管道(pipe) 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信: 实现机制: 管道是由内核管理的一个缓冲区,相当于我们放入内存中的一个纸条.管道的一端连接一个进程的输出.这个进程会向管道中放入信息.管道的另一端连接一个进程的输入,这个进程取出被放入管道的信息.一个缓冲区不需要很大,它被设计成为环形的数据结构,以便管…
进程间通信必须通过内核提供的通道,而且必须有一种办法在进程中标识内核提供的某个通道,前面讲过的匿名管道是用打开的文件描述符来标识的.如果要互相通信的几个进程没有从公共祖先那里继承文件描述符,它们怎么通信呢?内核提供一条通道不成问题,问题是如何标识这条通道才能使各进程都可以访问它?文件系统中的路径名是全局的,各进程都可以访问,因此可以用文件系统中的路径名来标识一个IPC通道. FIFO和UNIX Domain Socket这两种IPC机制都是利用文件系统中的特殊文件来标识的. FIFO文件在磁盘上…
每个进程都有各自的地址空间,任何一个进程的全局变量在另一个进程中都看不到 所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读出,内核提供的这种机制称为进程间通信. 管道:基本的IPC机制由int pipe(filedes[2])函数创建,调用函数在内核开辟一段缓冲区(管道)用于通信,它有一个读端一个写端,然后 通 过filedes参数传出给用户程序两个文件描述符,filedes[0]指向管道的读端,filedes[1]指…
1 命名管道(FIFO) 管道应用的一个重大缺陷就是没有名字,因此只能用于亲缘进程之间的通信.后来从管道为基础提出命名管道(named pipe,FIFO)的概念,该限制得到了克服.FIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中.这样,即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信(能够访问该路径的进程以及FIFO的创建进程之间),因此,通过FIFO不相关的进程也能交换数据.值得注意的是,FIFO严格遵循…
进程间通信系列 之 概述与对比   http://blog.csdn.net/younger_china/article/details/15808685  进程间通信系列 之 共享内存及其实例   http://blog.csdn.net/younger_china/article/details/15961557  进程间通信系列 之 共享内存简单实例   http://blog.csdn.net/younger_china/article/details/15991081  进程间通信系列…
命名管道(FIFO) 基本概念 命名管道和一般的管道基本相同,但也有一些显著的不同: 命名管道是在文件系统中作为一个特殊的设备文件而存在的. 不同祖先的进程之间可以通过管道共享数据. 当共享管道的进程执行完所有的I/O操作以后,命名管道将继续保存在文件系统中以便以后使用. 管道只能由相关进程使用,它们共同的祖先进程创建了管道.但是,通过FIFO,不相关的进程也能交换数据. 命名管道创建和操作:: #include #include int mkfifo(const char *pathname,…
管道和FIFO作为最初的UNIX IPC形式,现在已用得较少.SocketPair可作为全双工版本的管道,较为常用,这里简单做个笔记 管道 * 只用于有亲缘关系的进程间通信 * 单向,即半双工 (双向方法:1 使用2个管道 2 使用SocketPair) * pipe() => write()/read() FIFO (有名管道) * 可用于无亲缘关系的进程间通信 * 单向 * mkfifo() => open() => write()/read() SocketPair * 套接字(一…
管道 管道是Unix系统IPC的最古老方式,有两种局限性: (1)   历史上它们是半双工的(即数据只能在一个方向上流动),虽然现在某些系统提供了全双工管道,但是为了可移植性,不要抱有绝对的全双工假设. (2)   管道只能在具有公共祖先的两个进程之间使用(一般都是用于父子进程之间). 管道是通过调用pipe函数创建的: #include <unistd.h> int pipe(int fd[2]); 返回值:成功,返回0:失败,返回-1 说明: fd返回两个文件描述符:fd[0]用于读,fd…
管道 管道是unix ipc的最古老形式,是一种在内存中的特殊文件,只能在具有公共祖先的进程之间使用(即父子进程,兄弟进程). 管道由pipe函数创建 #include <unistd.h> ]) fd[1]写,fd[0]读. 单个进程的管道几乎没有任何用处,通常,调用pipe的进程接着调用fork,这样就创建了父子进程间的管道. #include <unistd.h> #include<stdio.h> #include<sys/types.h> #inc…
管道 1. 其本质是一个伪文件(实为内核缓冲区) 2. 由两个文件描述符引用,一个表示读端,一个表示写端. 3. 规定数据从管道的写端流入管道,从读端流出. 管道的原理: 管道实为内核使用环形队列机制,借助内核缓冲区(4k)实现. 管道的局限性: 数据一旦被读走,便不在管道中存在,不可反复读取. 缓冲区是有限 由于管道采用半双工通信方式.因此,数据只能在一个方向上流动. 只能在有公共祖先的进程间使用管道. 所传送的是无格式字节流 关闭未使用的管道文件描述符不仅仅是为了确保进程不会耗尽其文件描述符…
Linux进程间通信——使用命名管道 转载:http://blog.csdn.net/ljianhui/article/details/10202699 在前一篇文章——Linux进程间通信——使用匿名管道中,我们看到了如何使用匿名管道来在进程之间传递数据,同时也看到了这个方式的一个缺陷,就是这些进程都由一个共同的祖先进程启动,这给我们在不相关的的进程之间交换数据带来了不方便.这里将会介绍进程的另一种通信方式——命名管道,来解决不相关进程间的通信问题.   一.什么是命名管道 命名管道也被称为F…
首先我得检讨一下自己,这几天有些颓呀,打不起精神,板子出了点问题,果真自学还是很困难呀,硬件方面难解决呀,理想与现实还是很有差距的,伤透了,凌乱了. 一直在理解进程间通信的问题.发现上次忽略了一个问题,就是命名管道,命名管道和一般的管道有一些显著的不同: 1.FIFO是在文件系统中作为一个特殊的设备文件而存在的: 2.不同祖先的进程之间可以通过管道共享数据: 3.当共享管道的进程执行完所有的I/O操作后,FIFO将继续保存在文件系统中以便以后使用. 这里需要注意一下:管道只能由相关的进程使用,它…
管道: #include<stdio.h> #include<unistd.h> #include<stdlib.h> #include<string.h> #include<wait.h> /*管道没有名字,只能用于有亲缘关系的进程间通信*/ typedef struct stu { int id; ]; }Stu; int main() { ]; int ret=pipe(pfd);//创建管道(管道只能在父进程中创建) ) perror(&…
命名管道(FIFO)不同于无名管道之处在于它提供了一个路径名与之关联,以 FIFO 的文件形式存在于文件系统中,这样,即使与 FIFO 的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过 FIFO 相互通信,因此,通过 FIFO 不相关的进程也能交换数据. 命名管道(FIFO)和无名管道(pipe)有一些特点是相同的,不一样的地方在于: 1.FIFO 在文件系统中作为一个特殊的文件而存在,但 FIFO 中的内容却存放在内存中. 2.当使用 FIFO 的进程退出后,FIFO 文件将…
FIFO又被称为命名管道,未命名的管道只能在两个相关的进程之间使用,而这两个相关的进程还要有一个共同创建了它们的祖先进程,但是FIFO,不相关的进程之间也能交换数据. FIFO是一种文件类型.通过stat结构的st_mode成员的编码可以知道文件是否是FIFO类型,在linux下查看自己创建的FIFO文件: 创建FIFO类似于创建文件,也存在于文件系统之中.定义如下: #include <sys/stat.h> int mkfifo(const char* path, mode_t mode)…
管道和FIFO的特征之一是它们的数据是一个字节流.这是UNIX的原生I/O模型.进程往其中写入的是字节流,系统不对它作解释. FIFO不存数据,只是通过它找到内核文件. 一.建立有名管道 1.命令mknod   : mknod  name  p/s/m    //创建管道文件/信号量/共享内存 2.命令mkfifo 创建管道 mkfifo -m 664 k2     //创建一个访问权限为664的管道文件k2 3作为函数:mkfifo #include <sys/types.h> #inclu…
2017-04-07 管道通信在linux中使用较为频繁的进程通信机制.基于unix一切皆文件的传统,管道也是一种文件.所以可以使用一般的VFS接口对管道进行读写操作,如read.write.具体管道分为有名管道和无名管道.无名管道的使用场景较为局限,仅仅限制在有亲缘关系的进程之间通信,多由于父子进程.而有名管道使用就广泛一些,可以在任何有权限的进程之间进行通讯.而这正是有其本质的实现机制所导致的. 一.无名管道 在linux中,管道的实现没有具体的数据结构,而是借助了文件系统的file结构和V…
一.命名管道 如果我们想在不相关的进程之间交换数据,可以用FIFO文件来完成这项工作,它通常也被称为命名管道.命名管道是一种特殊类型的文件,它在文件系统中以文件名的形式存在,但是它的行为却和我们已经见过的没有名字的管道类似.我们可以在命令行上创建命名管道,也可以在程序中创建它. 命名管道(FIFO)和无名管道(pipe)有一些特点是相同的,不一样的地方在于: 1.FIFO 在文件系统中作为一个特殊的文件而存在,但 FIFO 中的内容却存放在内存中. 2.当使用 FIFO 的进程退出后,FIFO…
介绍:IPC$(Internet Process Connection) 是共享 " 命名管道 " 的资源,它是为了让进程间通信而开放的命名管道,通过提供可信任的用户名和口令,连接双方可以建立安全的通道并以此通道进行加密数据的交换,从而实现对远程计算机的访问. 四种默认共享: 共享名------资源----------------------注解 C$-----------C:------------------------默认共享 D$-----------D:-----------…
1.FIFO FIFO,又称命名管道.不同于pipe管道的只能用于拥有共同祖先进程的两个进程间通信,因FIFO通过路径绑定,所以即使是不相关的进程间也可通过FIFO进行数据交换. FIFO是一种文件类型.通过stat结构的st_mode成员的编码可以确定文件是否是FIFO类型,可通过S_ISFIFO宏进行测试. 2.FIFO创建 创建FIFO类似于创建文件. 头文件:#Include <sys/stat.h> 原型:int mkfifo(const char *path,mode_t mode…
一.匿名管道的一个限制就是只能在具有共同祖先的进程间通信命名管道(FIFO):如果我们想在不相关的进程之间切换数据,可以使用FIFO文件来做这项工作注意:命名管道是一种特殊类型文件.利用命令:$ mkfifo filename或者相关函数:int mkfifo(const char*filename,mode_t mode); 二.区别与联系匿名管道由pipe函数创建或打开命名管道由mkfifo函数创建,打开用open.FIFO与PIPE的区别在它们创建与打开的方式不同,一旦这些工作完后,它们语…
Linux进程间通信——使用匿名管道 在前面,介绍了一种进程间的通信方式:使用信号,我们创建通知事件,并通过它引起响应,但传递的信息只是一个信号值.这里将介绍另一种进程间通信的方式——匿名管道,通过它进程间可以交换更多有用的数据.   一.什么是管道 如果你使用过Linux的命令,那么对于管道这个名词你一定不会感觉到陌生,因为我们通常通过符号“|"来使用管道,但是管理的真正定义是什么呢?管道是一个进程连接数据流到另一个进程的通道,它通常是用作把一个进程的输出通过管道连接到另一个进程的输入.  …
一.参考网址 1.Linux学习之——FIFO实例…
紧接着上面一个博客的简单介绍,下面进行一个没有血缘关系的进程间通信的实例,实现文件拷贝传输. 有两个进程,一个主要是fifow进程:读文件Makefile内容,写入管道;另一个进程fifor:读管道内容,写入到Makefile2. 首先,写端会创建一个管道,然后读取Makefile内容,写入到管道tp中: #include<unistd.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h&g…
管道的分类 管道其实际就是一段共享内存,只不过Windows规定需要使用I/O的形式类访问这块共享内存,管道可以分为匿名管道和命名管道. 匿名管道就是没有名字的管道,其支持单向传输数据,如果需要双向传送数据就需要创建两条管道.而且其只支持具有父子关系的两个进程进行通信,不能在网络间进行通信. 命名管道就是有名字的管道,其支持双向传输数据,因此一般还需要创建一条命名管道实现两个进程间的通讯.他的实现类似于我们了解的客户端/服务端.他能在任意进程间进行通讯. 匿名管道 typedef struct…
接收端: #include <sys/stat.h> #include <sys/types.h> #include <stdio.h> #include <errno.h> #include <fcntl.h> #define MKFIFO "./myfifo" int main() { int ret; ret = mkfifo (MKFIFO,);//创建有名管道文件 )&&errno != EEXIST…
IPC(InterProcess Communication)进程间通信.为啥没有进程间通信,这是因为进程间都是同步的关系,不需要通信. 1.管道 1.1管道特点: (1)半双工的(即数据只能在一个方向上流动),某些系统提供全双工的管道. (2)管道只能在具有公共祖先的两个进程之间使用.通常,一个管道由一个进程创建,在进程调用fork后,这个管道就能在父子进程之间通信了. 1.2使用: (1)在管道中键入一条命令,让shell执行,shell会为每一条命令单独创建一个进程,然后用管道将浅一条命令…
http://blog.chinaunix.net/uid-25324849-id-3110075.html 部分转自:http://blog.chinaunix.net/uid-20620288-id-3025213.html 1.首先要明确进程和线程的含义: 进程(Process)是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位.与程序相比,程序只是一组指令的有序集合,它本身没有任何运行的含义,只是一个静态实体.进程是程序在某个数据集上的执行,…
我们先来说说进程间通信(IPC)的一般目的,大概有数据传输.共享数据.通知事件.资源共享和进程控制等.但是我们知道,对于每一个进程来说这个进程看到属于它的一块内存资源,这块资源是它所独占的,所以进程之间的通信就会比较麻烦,原理就是需要让不同的进程间能够看到一份公共的资源.所以交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间 拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信.一般我们采用的进程间通信方式有 管道(pipe)和有名管道(FIFO)…