管道通信,王明学learn
管道通信
一、通讯目的
1、数据传输
一个进程需要将数据发送给另一个进程。
2、资源共享
多个进程之间共享同样的资源。
3、通知事件
一个进程需要向另一个/组进程发送消息,通知它们发生了某事件。
4、进程控制
有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有操作,并能够及时知道它的状态改变。
二、通讯发展
Linux进程间通信(IPC:interprocesscommunication)由以下几部分发展而来:
1、UNIX进程间通信
2、基于System V进程间通信
3、POSIX进程间通信
POSIX(Portable Operating System Interface)表示可移植操作系统接口。电气和电子工程师协会IEEE最初开发POSIX 标准,是为了提高UNIX 环境下应用程序的可移植性。然而,POSIX 并不局限于UNIX,许多其它的操作系统,例如Microsoft Windows都支持POSIX 标准。
三、通讯方式
Linux进程间通讯的主要方式有:
1、无名管道(pipe)
2、有名管道(FIFO)
3、信号(signal)
4、消息队列
5、共享内存
6、信号量
7、套接字(socket)
四、管道通信
一个进程在管道的尾部写入数据,另一个进程从管道的头部读出数据。管道包括无名管道和有名管道两种,前者只能用于父进程和子进程间的通信,后者可用于运行于同一系统中的任意两个进程间的通信。
管道通信特点:
1.管道通讯是单向的,有固定的读端和写端。
2.数据被进程从管道读出后,在管道中该数据就不存在了。
3.当进程去读取空管道的时候,进程会阻塞。
4.当进程往满管道写入数据时,进程会阻塞。
5.管道容量为64KB(#definePIPE_BUFFERS16 include/linux/pipe_fs_i.h)
在Linux系统中,无名管道一旦创建完成后,操作无名管道等同于操作文件。无名管道的读端被视作一个文件;无名管道的写端也被视作一个文件。
五、无名管道函数学习pipe
5.1 函数原形
int pipe(int pipefd[2]);
5.2函数功能
创建无名管道
5.3 所属头文件
<unistd.h>
5.4 返回值
成功:返回 0
失败:返回-1
5.5 参数说明
pipefd[2]返回两个文件描述符,两个元素分别指向两端
pipefd[0]:指向管道读端
pipefd[1]:指向管道写端
六、有名管道
有名管道又称为FIFO文件,因此我们对有名管道的操作可以采用操作文件的方法,如使用open,read,write等.
6.1FIFO文件对比普通文件
FIFO文件在使用上和普通文件有相似之处,但是也有不同之处:
1.读取Fifo文件的进程只能以”RDONLY”方式打开fifo文件。
2.写Fifo文件的进程只能以”WRONLY”方式打开fifo文件。
3.Fifo文件里面的内容被读取后,就消失了。但是普通文件里面的内容读取后还存在。
当执行写fifo文件后则进程一直处于阻塞状态直到有进程去读取管道中的文件
6.2 创建有名管道
6.2.1 函数名
mkfifo
6.2.2 函数原形
int mkfifo(const char* pathname,mode_t mode);
6.2.3 函数功能
创建fifo文件(有名管道)
6.2.4 所属头文件
<sys/types.h> <sys/stat.h>
6.2.5 返回值
成功:返回 0
失败:返回-1
6.2.6 参数说明
pathname:要创建的fifo文件的名字(包含路径)
mode:标明白创建fifo文件访问权限
6.3 删除有名管道
6.3.1 函数名
unlink
6.3.2 函数原形
int unlink(const char* pathname);
6.3.3 函数功能
删除文件,包含fifo文件
6.3.4 所属头文件
<unistd.h>
6.3.5 返回值
成功:返回0
失败:返回-1
6.3.6 参数说明
指定要删除文件的名称(包含路径)
管道通信,王明学learn的更多相关文章
- 消息队列通信,王明学learn
消息队列通信 消息队列就是一个消息(一个结构)的链表.而一条消息则可看作一个记录,具有特定的格式.进程可以从中按照一定的规则添加新消息:另一些进程则可以从消息队列中读走消息. 每一个消息都是一个结构体 ...
- linux内核的组成,王明学learn
linux内核的组成 一.linux内核源代码目录结构 arch: 包含和硬件体系结构相关的代码, 每种平台占一个相应的目录, 如 i386.ARM.PowerPC.MIPS 等. block:块设备 ...
- 共享内存同行,王明学learn
共享内存同行 一.共享内存概念 共享内存是IPC机制中的一种,它允许两个不相关的进程访问同一段内存, 这是传递数据的一种非常有效的方式. 二.函数学习 这里主要有创建共享内存.映射共享内存.分离共享内 ...
- linux驱动程序设计的硬件基础,王明学learn
linux驱动程序设计的硬件基础(一) 本章讲总结学习linux设备程序设计的硬件基础. 一.处理器 1.1通用处理器 通用处理器(GPP)并不针对特定的应用领域进行体系结构和指令集的优化,它们具有一 ...
- linux设备驱动概述,王明学learn
linux设备驱动学习-1 本章节主要学习有操作系统的设备驱动和无操作系统设备驱动的区别,以及对操作系统和设备驱动关系的认识. 一.设备驱动的作用 对设备驱动最通俗的解释就是“驱使硬件设备行动” .设 ...
- usb设备驱动描述,王明学learn
usb设备驱动 本章主要内容包含以下:USB总线介绍,USB协议分析,USB系统架构 一.USB总线介绍 1.1USB发展史 USB(Universal Serial Bus)通用串行总线,是一种外部 ...
- 信号量进程同步,王明学learn
信号量进程同步 一组并发进程进行互相合作.互相等待,使得各进程按一定的顺序执行的过程称为进程间的同步. 信号量在进程同步时初始值为:0 信号量在进程互斥时初始值为:大于0的 本章节主要使用信号量,使的 ...
- 信号量互斥,王明学learn
信号量互斥 信号量(又名:信号灯)与其他进程间通信方式不大相同,主要用途是保护临界资源(进程互斥).进程可以根据它判定是否能够访问某些共享资源.除了用于访问控制外,还可用于进程同步. 一.信号量分类 ...
- 信号通讯编程,王明学learn
信号通讯编程 在Linux系统中,信号(signal)同样也是最为古老的进程间通信机制. 一.信号类型 Linux系统支持的所有信号均定义在/usr/include/asm/signal.h(展示), ...
随机推荐
- php中set_time_limit()函数运用
当你的页面有大量数据时,建议使用set_time_limit()来控制运行时间,默认是30s,所以需要你将执行时间加长点. 如 set_time_limit(800) ,其中将秒数设为0 ,表示持续 ...
- 向SqlServer数据库插入数据
Insert Values Insert Select Insert Exec Select Into Bulk Insert Insert Values是最常用的一种插入数据的方式,基本语法如下,表 ...
- Python之异常追踪模块:traceback
正常时输出追踪信息: import traceback def stack(): print 'The python stack:' traceback.print_stack() from twis ...
- python virtualenv环境运行django
python virtualenv环境运行django 安装前准备 检查pip版本与python版本是否一致 [root@localhost bin]# whereis pip pip: /usr/b ...
- Linux下编译安装python3
Linux下默认系统自带python2.6的版本,这个版本被系统很多程序所依赖,所以不建议删除,如果使用最新的Python3那么我们知道编译安装源码包和系统默认包之间是没有任何影响的,所以可以安装py ...
- ACM/ICPC 之 两道dijkstra练习题(ZOJ1053(POJ1122)-ZOJ1053)
两道较为典型的单源最短路径问题,采用dijkstra解法 本来是四道练习题,后来发现后面两道用dijkstra来解的话总觉得有点冗余了,因此暂且分成三篇博客(本篇以及后两篇). ZOJ1053(POJ ...
- Python 之 【markdown 模块的学习】
摘要: markdown工具,可以将txt转化成html格式.这一类工具的作用是将按一定格式写成的可读性强的文本文件转化为结构化的标准xhtml或html.Linux 下面也有markdown: zh ...
- 警告: 程序集绑定日志记录被关闭(IIS7 64位系统)
部署一个.NET程序在IIS7服务器,出现如下信息: 说明: 执行当前 Web 请求期间,出现未处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息: S ...
- WdatePicker组件不显示
突然发现时间组件不显示了,以为是浏览器的问题.在本地服务器测试了一下发现一切正常. 怀疑是前段时间中毒引起的,用工具比对了一下WdatePicker的文件包,发现My97DatePicker.htm这 ...
- Effective C++ -----条款30:透彻了解inlining的里里外外
将大多数inlining限制在小型.被频繁调用的函数身上.这可使日后的调试过程和二进制升级(binary upgradability)更容易,也可使潜在的代码膨胀问题最小化,使程序的速度提升机会最大化 ...