进程间通信概述

  • 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间
  • 共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。
  • 通知时间:一个进程需要向另一个或一组进程发送消息,通知他们发生了某些事件(如进程终止时要通知父进程)
  • 资源共享:多个进程之间共享同样的资源,为了做到这一点,需要内核提供锁和同步机制
  • 进程控制:有些进程希望完全控制另一个进程的执行(如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. 通俗易懂的lambda表达式,不懂来找我!

    lambda是Python编程语言中使用频率较高的一个关键字.那么,什么是lambda?它有哪些用法?网上的文章汗牛充栋,可是把这个讲透的文章却不多.这里,我们通过阅读各方资料,总结了关于Python ...

  2. 浅谈TCP扫描与SYN扫描与FIN扫描

    下面就这三种方法来小小的探讨一下,不对的地方还请多多指教! 1:TCP扫描 相对来说是速度比较慢的一种,为什么会慢呢?因为这种方法在扫描的时候会从本地主机的一个端口向目标主机的一个端口发出一个连接请求 ...

  3. amh 操作

    挂在分区到/home 迁移数据库/usr/local/mysql/data 到/home/data目录 504 卡死 进入kangle后台,选扩展,再选中扩展里的命令选项,修改PHP-NTS的协议为f ...

  4. hadoop的单机配置

    hadoop的单机配置 准备工作 利用vim /etc/sysconfig/network命令修改主机名称. Ssh security shell 远程登录 登录远程服务器 $ ssh user@ho ...

  5. nginx配置反向代理支持session

    Nginx反向代理tomcat,很是方便,但是也有些细节的问题需要注意:今天遇到了这样一个问题,tomcat中路径“host/web1”,nginx中直接“host/”代理,这时候session就无法 ...

  6. 关于springcloud hystrix 执行 hystrix.stream 跳转失败的问题

    经过观看网友的总结:应该时版本的问题.某些版本没有对/hystrix.stream进行配置 所以解决方案(网友答案): 需要配置类配置下面 @Bean public ServletRegistrati ...

  7. Python_4day

    函数 函数可以用来定义可重复代码,组织和简化 一般来说一个函数在实际开发中为一个小功能 一个类为一个大功能 同样函数的长度不要超过一屏   Python中的所有函数实际上都是有返回值(return N ...

  8. Collection接口的子接口——List接口

    https://docs.oracle.com/javase/8/docs/api/java/util/List.html public interface List<E> extends ...

  9. [Nest] 02.nest之控制器

    控制器 Controller Nest 的核心概念 模块 Module 控制器 Controller 服务与依赖注入 Provider Dependency injection 控制器负责处理应用的特 ...

  10. 【原创】运维基础之Nginx(3)location和rewrite

    nginx location =:精确匹配(必须全部相等) ~:大小写敏感,正则匹配 ~*:忽略大小写,正则匹配 ^~:只需匹配uri部分,精确匹配 @:内部服务跳转,精确匹配 优先级: Exact ...