进程间通信概述

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

    摘要:在学习python递归知识点时,总是一知半解,似懂非懂的..在反复看视频翻资料同时,也收集案例来分析求证..通过分析下面几个案例希望能有所帮助!!! 1.用递归的方法实现阶乘... def nu ...

  2. svn修改代码URL整合路径

    我们平常开发的代码都是在A服务器上整合的,最近A服务器突然无法访问了,所以今天我们更换了一下服务器.svn如何安装的就不说了,这里只介绍一下如何更换SVN URL的. 在你拿到URL后,在工作文件夹下 ...

  3. linux上传文件的命令——rz

    下面来看一下有关上传下载的说明. 1.rz.sz命令的安装方法 第一种方法:安装系统时选包包含rz.sz命令的包组 第二种方法:安装系统后通过执行yum install lrzsz -y 或 yum ...

  4. Jira和confluence备份

    参考: https://www.cnblogs.com/kevingrace/p/8862531.html JIRA备份和还原:  #Jira默认会打开自动备份的功能,备份路径为: /data/atl ...

  5. PTA(Basic Level)1029.旧键盘

    旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及实际被输入的文字,请你列出肯定坏掉的那些键. 输入格式: 输入在 2 行中分别给出应该输入的文字.以及 ...

  6. mysql语法难点

    select * from emp where comm is null or comm=0;/*没有提成的员工*/ 查询有提成的员工所有信息 select * from emp where comm ...

  7. sqlserver安装和踩坑经历

    sqlserver安装和踩坑经历 下载 下载 安装 大致是按照这个来的 安装教程 出错 windows系统安装软件弹出"Windows installer service could not ...

  8. Magento2入门之修改logo

    本文用于学习记录用 1.主题创建是在路径 /app/design/frontend/公司名/主题名称/ 我自己创建的路径为 app/design/frontend/Bman/castle,以下操作都在 ...

  9. Laravel之杂记

    1.composer设置国内镜像加速 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ 2 ...

  10. Java小程序—录屏小程序(下半场)

    下半场. 上半场,我们我们写了录屏的程序,那么下半场我们的任务是写一个播放器. 设计思路:播放器的思路就是将图片放在一个JScrollPane中顺序播放,所以还是得使用swing组件,并且仍然要使用线 ...