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:进程间通信的更多相关文章

  1. UNIX高级环境编程1

    UNIX高级环境编程1 故宫角楼是很多摄影爱好者常去的地方,夕阳余辉下的故宫角楼平静而安详. 首先,了解一下进程的基本概念,进程在内存中布局和内容. 此外,还需要知道运行时是如何为动态数据结构(如链表 ...

  2. UNIX高级环境编程(14)文件IO - O_DIRECT和O_SYNC详解 < 海棠花溪 >

    春天来了,除了工作学习,大家也要注意锻炼身体,多出去运动运动.  上周末在元大都遗址公园海棠花溪拍的海棠花.   进入正题. O_DIRECT和O_SYNC是系统调用open的flag参数.通过指定o ...

  3. Unix高级环境编程

    [07] Unix进程环境==================================1. 进程终止    atexit()函数注册终止处理程序.    exit()或return语句:    ...

  4. UNIX高级环境编程(5)Files And Directories - 文件相关时间,目录文件相关操作

     1 File Times 每个文件会维护三个时间字段,每个字段代表的时间都不同.如下表所示: 字段说明: st_mtim(the modification time)记录了文件内容最后一次被修改的时 ...

  5. unix高级环境编程学习笔记第七章(未完)

    博客地址:http://www.cnblogs.com/zengjianrong/p/3222081.html 7.1 引言 Main函数调用:命令行参数:存储器布局:如何分配存储器:进程使用env: ...

  6. C#高级编程 第十五章 反射

    (二)自定义特性 使自定义特性非常强大的因素时使用反射,代码可以读取这些元数据,使用它们在运行期间作出决策. 1.编写自定义特性 定义一个FieldName特性: [AttributeUsage(At ...

  7. 【读书笔记】C#高级编程 第二十五章 事务处理

    (一)简介 事务的主要特征是,任务要么全部完成,要么都不完成. (二)概述 事务由事务管理器来管理和协调.每个影响事务结果的资源都由一个资源管理器来管理.事务管理器与资源管理器通信,以定义事务的结果. ...

  8. 【读书笔记】C#高级编程 第十五章 反射

    (一)在运行期间处理和检查代码 自定义特性允许把自定义元数据与程序元素关联起来.反射是一个普通术语,它描述了在运行过程中检查和处理程序元素的功能.例如,反射允许完成的任务: 枚举类型的成员 实例化新对 ...

  9. UNIX高级环境编程(16)文件系统 < 雨后 >

    来点绿色放松一下眼睛吧 :) 文件系统是对文件和目录的组织集合. 一 设备文件 设备文件和系统的某个设备相对应. 设备驱动程序 处理设备的所有IO请求. 提供了一致的API接口,对应于系统调用的ope ...

随机推荐

  1. 简约的ASP.NET 系统框架,提供源码。

    好东西,好东西就要分享. 其实谈不上什么好东西,但很实用,应用起来也很简单,我自己用它构建了多套ASP .NET系统,原理也很简单: 1.用XML文件编辑系统的菜单和Toolbar: 2.读取XML节 ...

  2. Strint类成员

    String& String::operator=(const string& other){ if(this == &other) {  return *this; } de ...

  3. php SimpleXML 例子

    $txt = GetRemoteText($url); if(strlen($txt) > 0) { $xml = simplexml_load_string($txt); //获取xml if ...

  4. STL set使用例子

    #include<iostream>#include<set>using namespace std; #include<stdlib.h> #define ran ...

  5. 两系统用asp.net forms 身份验证方式实现跨域登录信息共享

    1.两个系统的 web.config 都配置为 forms 验证方式( system.web —> authentication 节点) 2.在两个系统的Web.config里配置相同的 sys ...

  6. cctype头文件中的一些内容

    1. string 标准库 1.1初始化 string s1; 默认构造函数s1为空 string s2(s1); 将s2初始化为s1的一个副本 string s3(“value”); 将s3初始化为 ...

  7. java.lang.ClassNotFoundException: org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

    报这个错是因为加的struts的jar包有问题... 另外,jar包应该放在WEB-INF下的lib文件夹里面,且不必Add to build path,该目录下的jar包会自动引入 使用struts ...

  8. css3动画3

    1.transition过渡动画 2.@keyframes关键帧动画,配合transform.animation使用

  9. MongoDB(八)Mongodb——GridFS存储

    mongoDB的文档以BSON格式存储,支持二进制的数据类型,当我们把二进制格式的数据直接保存到mongoDB的文档中.但是当文件太大时,例如图片和视频等文件,每个文档的长度是有限的,于是mongoD ...

  10. PHP5.3、PHP5.4下安装ZendOptimizer或Zend Guard Loader的方法

    现在很多PHP程序都需要ZendOptimizer环境,但是ZendOptimizer在PHP5.2之后已经被支持,那怎么办,Zend也不会这么做,原来PHP5.3开始ZendOptimizer正式改 ...