进程间通信概述

  • 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间
  • 共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。
  • 通知时间:一个进程需要向另一个或一组进程发送消息,通知他们发生了某些事件(如进程终止时要通知父进程)
  • 资源共享:多个进程之间共享同样的资源,为了做到这一点,需要内核提供锁和同步机制
  • 进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入的异常,并能够及时指导它的状态改变。
 

进程间通信方式

  • 管道(pipe),有名管道(FIFO)
  • 信号(signal)
  • 消息队列
  • 共享内存
  • 信号量
  • 套接字(socket)
 

管道

  • 管道针对本地计算机的两个进程之间的通信而设计的通信方式,管道建立后,实际获得两个文件描述符:一个用于读取另一个用于写入。
  • 常见的IPC机制,通过pipe系统调用。
  • 管道单工,数据只能向一个方向流动。双向通信时,需要建立两个管道。
  • 数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道的缓冲区的尾部,每次都是从缓冲区的头部读出数据。
 

管道的分类

  • 匿名管道

    • 关系进程,父子或兄弟
    • 由pipe系统调用,管道由父进程建立
    • 管道位于内核空间,其实是一块缓存
  • 有名管道(FIFO) 
    • 两个没有任何关系的进程之间通信可通过有名管道进行数据传输
    • 通过系统调用mkfifo创建
 

管道创建

 
  1. #include<unistd.h>
  2. int pipe(int fd[2]);
  3. //返回:0成功,-1出错
  • 两个文件描述符数组

    • fd[0]:pipe的读端
    • fd[1]:pipe的写端

管道通信是单向的阻塞性IO

借助管道使两个子进程相互通讯

  • 一个子进程调用execvp函数,将执行结果写入管道
  • 另外一个子进程也是调用execvp函数,从管道中读取命令结果进行过滤。
  • 涉及改变标准输入输出,重定向。

$ cat /etc/passwd |grep root

 
 #include <unistd.h>
#include <stdio.h>
#include <stdlib.h> char *cmd1[]={"/bin/cat","/etc/passwd",NULL};
char *cmd2[]={"/bin/grep","root",NULL}; int main(void)
{
int fd[];
if(pipe(fd)<)
{
perror("pipe error");
exit();
}
int i=;
pid_t pid;
for(;i<=;i++)
{
pid=fork();
if(pid<)
{
perror("fork error");
exit();
}
else if(pid==)
{
//child process
if(i==)
{
//子进程1,负责写入数据
close(fd[]);//关闭读端 //将标准输出重定向到管段的写端
if(dup2(fd[],STDOUT_FILENO)
!=STDOUT_FILENO)
{
perror("dup2 error");
}
close(fd[]); //调用exec函数执行cat命令
if(execvp(cmd1[],cmd1<))
{
perror("excvp error");
exit();
}
break;
}
if(i==)
{
//子进程2,负责从管道读取数据
close(fd[]);//关闭写端 //将标准输入重定向到管道的读端
if(dup2(fd[],STDIN_FILENO)
!=STDIN_FILENO)
{
perror("dup2 error");
}
close(fd[]); //调用exec函数执行grep命令
if(execvp(cmd2[],cmd2)<)
{
perror("execvp error");
exit();
}
break; }
}else
{
//parent process
if(i==)
{
//父进程要等到子进程全部创建完毕才去回收
close(fd[]);
close(fd[]);
wait();
wait();
}
}
}
}

IPC 进程间通信方式——管道的更多相关文章

  1. IPC 进程间通信方式——共享内存

    共享内存 共享内存区域是被多个进程共享的一部分物理内存. 多个进程都可以把共享内存映射到自己的虚拟空间.所有用户空间的进程要操作共享内存,都要将其映射到自己的虚拟空间,通过映射的虚拟内存空间地址去操作 ...

  2. IPC 进程间通信方式——消息队列

    消息队列 消息队列是内核中的一个链表 用户进程将数据传输到内核后,内核重新添加一些如用户ID.组ID.读写进程的ID和优先级等相关信息后并打包成一个数据包称为消息 允许一个或多个进程往消息队列中读写消 ...

  3. IPC 进程间通信方式——信号量

    信号量 本质上是共享资源的数目,用来控制对共享资源的访问. 用于进程间的互斥和同步 每种共享资源对应一个信号量,为了便于大量共享资源的操作引入了信号量集,可对多对信号量一次性操作.对信号量集中所有的操 ...

  4. 进程间通信IPC之--无名管道(pipe)和有名管道(fifo)(转)

     进程间通信IPC之--无名管道(pipe)和有名管道(fifo) 2012-01-17 22:41:20 分类: C/C++ 每个进程各自有不同的用户地址空间,任何一个进 程的全局变量在另一个进程中 ...

  5. unix进程间通信方式(IPC)

    unix进程间通信方式(IPC) 管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信. 命名管道(named pipe):命名管道克服了管道没有 ...

  6. 【windows 操作系统】进程间通信(IPC)简述|无名管道和命名管道 消息队列、信号量、共享存储、Socket、Streams等

    一.进程间通信简述 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进 ...

  7. 解Linux进程间通信(IPC)方式

    http://blog.csdn.net/liuhongxiangm/article/details/7928790 linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的.而对U ...

  8. 【IPC第二个进程间通信】管道Pipe

    IPC进程间通信+管道Pipe                IPC(Inter-Process Communication,进程间通信).         管道用于进程间共享数据,事实上质是共享内存 ...

  9. Nucleus进程间通信(IPC)方式

    版权声明:本文为博主原创文章,未经博主同意不得转载--"http://blog.csdn.net/suipingsp". https://blog.csdn.net/suiping ...

随机推荐

  1. @Conditional注解

    根据条件动态创建bean public class TestConditon implements Condition { public boolean matches(ConditionContex ...

  2. 【POJ - 3187】Backward Digit Sums(搜索)

    -->Backward Digit Sums 直接写中文了 Descriptions: FJ 和 他的奶牛们在玩一个心理游戏.他们以某种方式写下1至N的数字(1<=N<=10). 然 ...

  3. cisco路由的ip静态路由添加(二)

    路由器Corp 配置Corp(config)#ip route 192.168.20.0 255.255.255.0 10.1.3.2 150 Corp(config)#ip route 192.16 ...

  4. Python3数据插MySQL中文乱码解决方案

    1. database要utf8的 CREATE DATABASE spiderTest DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 2. ...

  5. NIO入门

    NIO:Non-blocking IO,即非阻塞式IO. 标准的IO基于字节流和字符流进行操作. 而NIO基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从Channel读取到Bu ...

  6. AKKA文档2.2(java)——术语,概念

    原文:http://doc.akka.io/docs/akka/2.3.6/general/terminology.html 译者:吴京润 本章我们试图建立一个通用的术语列表,用来定义有关并发和分布式 ...

  7. USB键盘驱动分析

    简介 本文介绍USB驱动程序编写的流程,分析一个键盘的USB程序,基于linux-2.6.39 USB驱动概要 分层 主机层面的USB驱动的整体架构可以分成4层,自顶到下依次是 1.USB设备驱动:本 ...

  8. java中接口知识点大总结

    接口的确很不好理解!!!!!那我来好好总结一下: 首先要理解接口是一个独立存在的,和类是不一样的东西,所以,直接用接口的定义是: 访问权限控制符 interface 接口名 [extends  接口列 ...

  9. spring boot jpa @PreUpdate结合@DynamicUpdate使用的局限性

    通常给实体添加audit审计字段是一种常用的重构方法,如下: @Embeddable @Setter @Getter @ToString public class Audit { /** * 操作人 ...

  10. Freemarker生成word文档的时的一些&,>,<报错

    替换模板ftl中的内容的时候,一些特殊的字符需要转移,例如: &,<,> value为字符串 value.replace("&","& ...