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. 共享业务稳定性测试&技术创新组

    本文其实是一篇招聘贴,不管你以前是做开发还是测试,都欢迎加入我们的小组. 2014年阿里巴巴的共享业务事业部有很大变化,共享的测试团队也做了一些调整,我不再担任共享业务的测试经理,但是仍然会留在共享测 ...

  2. Linux RPM、TAR包管理

    一.RPM软件包命令的使用 RPM主要有5种基本操作模式:安装.卸载.刷新.升级及查询.下面分别介绍. 1.安装软件包 命令语法: rpm -ivh [RPM包文件名称] 命令中各参数的含义如下: - ...

  3. Apache 日志管理,获取客户端端口号

    日志管理分类 日志文件是用户管理和监控 Apache 安全的非常好的第一手资料,它清晰地记录了客户端访问 Apache 服务器资源的每一条记录,以及在访问中出现的错误信息,可以这样说,Apache 可 ...

  4. 慕课网-Java入门第一季-6-9

    来源:http://www.imooc.com/code/1571 所谓二维数组,可以简单的理解为是一种“特殊”的一维数组,它的每个数组空间中保存的是一个一维数组. 那么如何使用二维数组呢,步骤如下: ...

  5. 初学android之简易的网易页面

    WangYiActivity.java: public class WangYiActivity extends Activity implements OnClickListener{ public ...

  6. javascript-with()方法

    1)简要说明         with 语句可以方便地用来引用某个特定对象中已有的属性,但是不能用来给对象添加属性.要给对象创建新的属性,必须明确地引用该对象. 2)语法格式  with(object ...

  7. 第一天 :学习node.js

    ① node.js环境配置 我学过的语言最简单的一门 直接百度就可以配置 ② 每个入门 的程序都是从helloworld开始 代码如下 : var http=require('http'); http ...

  8. JS中offsetTop、clientTop、scrollTop、offsetTop各属性介绍

    这里是javascript中制作滚动代码的常用属性 页可见区域宽: document.body.clientWidth;网页可见区域高: document.body.clientHeight;网页可见 ...

  9. 利用JAVA生成二维码

    本文章整理于慕课网的学习视频<JAVA生成二维码>,如果想看视频内容请移步慕课网. 维基百科上对于二维码的解释. 二维条码是指在一维条码的基础上扩展出另一维具有可读性的条码,使用黑白矩形图 ...

  10. 用浏览器模拟各种User Agent

    转至:http://www.cnblogs.com/top5/archive/2012/06/07/2540686.html 测试页面的时候经常需要不同的User Agent,Firefox.Chro ...