UNIX:高级环境编程 - 第十五章 IPC:进程间通信
IPC(InterProcess Communication)进程间通信.为啥没有进程间通信,这是因为进程间都是同步的关系,不需要通信.
1.管道
1.1管道特点:
(1)半双工的(即数据只能在一个方向上流动),某些系统提供全双工的管道.
(2)管道只能在具有公共祖先的两个进程之间使用.通常,一个管道由一个进程创建,在进程调用fork后,这个管道就能在父子进程之间通信了.
1.2使用:
(1)在管道中键入一条命令,让shell执行,shell会为每一条命令单独创建一个进程,然后用管道将浅一条命令进程的标准输出与后一条命令的标准输入链接.
(2)管道通过调用pipe函数来创建:
#include<unistd.h>
int pipe(int fd[]);
#include "apue.h" int
main(void)
{
int n;
int fd[];
pid_t pid;
char line[MAXLINE]; if (pipe(fd) < )
err_sys("pipe error");
if ((pid = fork()) < ){
err_sys("fork error");
}else if(pid > ){ /* parent */
close(fd[]);
write(fd[], "hello son, this is from your dad\n", );
}else{ /* child */
close(fd[]);
n = read(fd[], line, MAXLINE);
write(STDOUT_FILENO, line, n);
}
exit();
}
1.3原理:
首先父进程创建一个父进程到父进程的管道,然后fork得到子进程,子进程同样得到了父进程的管道.然后父进程关闭读端,子进程关闭写端.从而得到了一条父进程写 子进程读的管道.
1.4 popen和pclose:
常见的操作是创建一个链接到另一个进程的管道,然后读其输出或向其输入端发送数据,为此,标准I/O库提供了两个函数popen和pclose来实现这样的操作:创建一个管道,fork一个子进程,关闭未使用的管道端,执行一个shell运行命令,然后等待命令终止.
2.FIFO
FIFO有时被称为命名管道.未命名的管道只能在两个相关的进程之间使用,而且这两个相关进程还要有一个共同的创建他们的祖先.
但是FIFO,不相关的进程也可以交换数据.
FIFO是一种文件类型.创建FIFO类似于创建一个文件.
2.1用途:
(1)shell命令使用FIFO将数据从一条管道传送到另一条时,无需创建中间文件;
用FIFO复制输出流
(2)客户进程-服务器进程应用程序中,FIFO用作汇聚点,在客户进程和服务器进程二者之间传递数据.
使用FIFO进行客户进程-服务器进程通信
XSI IPC(消息队列\信号量或者共享存储器)
标识符和键:
每个内核中的IPC结构(消息队列\信号量或者共享存储器)都用一个非负整数的标识符加以引用.
每个IPC对象都与一个键(key)相关联,将这个键作为该对象的外部名.
权限结构:
3 消息队列
消息队列是消息的链接表,存储在内核中,由消息队列标识符标识.与命名管道一样,消息队列可以在不相关进程之间进行通信.二者都是通过发送和接收的方式来传递数据的.
在命名管道中 发送数据write 接收数据read
在消息队列中 发送数据msgsnd 接收数据msgrcv
他们对每个数据都有一个最大长度的限制.
4 信号量
信号量是一个计数器,他与IPC机构(管道 FIFO 消息队列)不同.
信号量主要用来为多个进程提供对共享数据对象的访问.
为了获得共享资源,进程需要执行下列操作:
(1)测试控制该资源的信号量.
(2)若此信号量的值未正,则进程可以是使用该共享资源.在这种情况下,进程会将信号量-1,表示它使用了一个资源单位.
(3)否则,若信号量=0,则进程进入休眠状态,直至信号量>0
信号量值的测试以及减1操作应该是原子操作.
4.1分类:
(1)内核信号量, 由内核控制路径使用
(2)用户态进程使用的信号量,又分POSIX信号量和SYSTEM V信号量。
POSIX信号量又分为有名信号量和无名信号量。
有名信号量,其值保存在文件中, 所以它可以用于线程也可以用于进程间的同步。
无名信号量,其值保存在内存中。
信号量 记录锁和互斥量的时间比较:
如果在多个进程间共享一个资源,可以使用这3种技术中的一种来协调访问.
5 共享存储:
共享存储允许两个或以多个进程共享一个给定的存储区.(同一逻辑内存)因为数据不需要在客户进程和服务器进程之间复制,所以是最快的一种IPC.
有一个数据同步的问题,就是在服务端在向内存里面写数据完成之前,不应当又客户端取数据,通常,信号量用于同步共享存储访问.(也可以使用 记录锁 或 互斥量)
UNIX:高级环境编程 - 第十五章 IPC:进程间通信的更多相关文章
- UNIX高级环境编程1
UNIX高级环境编程1 故宫角楼是很多摄影爱好者常去的地方,夕阳余辉下的故宫角楼平静而安详. 首先,了解一下进程的基本概念,进程在内存中布局和内容. 此外,还需要知道运行时是如何为动态数据结构(如链表 ...
- UNIX高级环境编程(14)文件IO - O_DIRECT和O_SYNC详解 < 海棠花溪 >
春天来了,除了工作学习,大家也要注意锻炼身体,多出去运动运动. 上周末在元大都遗址公园海棠花溪拍的海棠花. 进入正题. O_DIRECT和O_SYNC是系统调用open的flag参数.通过指定o ...
- Unix高级环境编程
[07] Unix进程环境==================================1. 进程终止 atexit()函数注册终止处理程序. exit()或return语句: ...
- UNIX高级环境编程(5)Files And Directories - 文件相关时间,目录文件相关操作
1 File Times 每个文件会维护三个时间字段,每个字段代表的时间都不同.如下表所示: 字段说明: st_mtim(the modification time)记录了文件内容最后一次被修改的时 ...
- unix高级环境编程学习笔记第七章(未完)
博客地址:http://www.cnblogs.com/zengjianrong/p/3222081.html 7.1 引言 Main函数调用:命令行参数:存储器布局:如何分配存储器:进程使用env: ...
- C#高级编程 第十五章 反射
(二)自定义特性 使自定义特性非常强大的因素时使用反射,代码可以读取这些元数据,使用它们在运行期间作出决策. 1.编写自定义特性 定义一个FieldName特性: [AttributeUsage(At ...
- 【读书笔记】C#高级编程 第二十五章 事务处理
(一)简介 事务的主要特征是,任务要么全部完成,要么都不完成. (二)概述 事务由事务管理器来管理和协调.每个影响事务结果的资源都由一个资源管理器来管理.事务管理器与资源管理器通信,以定义事务的结果. ...
- 【读书笔记】C#高级编程 第十五章 反射
(一)在运行期间处理和检查代码 自定义特性允许把自定义元数据与程序元素关联起来.反射是一个普通术语,它描述了在运行过程中检查和处理程序元素的功能.例如,反射允许完成的任务: 枚举类型的成员 实例化新对 ...
- UNIX高级环境编程(16)文件系统 < 雨后 >
来点绿色放松一下眼睛吧 :) 文件系统是对文件和目录的组织集合. 一 设备文件 设备文件和系统的某个设备相对应. 设备驱动程序 处理设备的所有IO请求. 提供了一致的API接口,对应于系统调用的ope ...
随机推荐
- MySQL For Windows修改最大连接数
1.从官网下载安装MySQL Installer.MySQL Installer 提供了简单易用.向导式的 MySQL 软件的安装体验过程(目前只支持 Windows),包含的产品有: MySQL S ...
- Windows消息大全(转)
原链接地址: http://www.cnblogs.com/icebutterfly/archive/2011/08/05/2128864.html 表A-1 Windows消息分布 消息范围说 明 ...
- Mono 异步加载数据更新主线程
主要是用 async和 await 调用 RunOnUiThread来更新. 调用函数: //异步加载数据开始 doInBackground (); //异步加载数据开始end protected a ...
- 使用 Google Web Fonts
Google Fonts 的介绍:Google Fonts 并不是简单的字体下载站 Google Fonts 地址:https://www.google.com/fonts 左上角可以输入查找的字体名 ...
- js屏蔽浏览器右键菜单,粘贴,复制,剪切,选中(转)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 不安装Oracle客户端情况下使用PL/SQL 远程连接数据库
附送PL/SQL Developer11中文版下载地址 1.先到Oracle网站下载Instant Client : http://www.oracle.com/technetwork/databas ...
- Json 字符串 转换为 DataTable数据集合
/// <summary> /// 将json转换为DataTable /// </summary> /// <param name="strJson" ...
- session 丢失和解决方案
在ASP.NET的开发中,总遇到Session丢失.最常见的情况是当用户登录后将用户信息保存在Session中例如Session["user"]=user;在其后的页面中检查Ses ...
- ASP.NET MVC 实现AJAX跨域请求方法《1》
ASP.NET MVC 实现AJAX跨域请求的两种方法 通常发送AJAX请求都是在本域内完成的,也就是向本域内的某个URL发送请求,完成部分页面的刷新.但有的时候需要向其它域发送AJAX请求,完成数据 ...
- OC中property的有关属性
property的有关属性: (1)readwrite是可读可写特征:需要生成getter方法和setter方法: (2)readonly是只读特性只会生成getter方法不会生成setter方法: ...