进程间通信

  • 一、进程间通信
    • 1.进程间通信——管道
      • (1)有名管道的创建
      • (2)有名管道的操作
        • 写操作
        • 读操作
        • 发生阻塞和关闭程序的几种情况
      • 2.无名管道的创建
      • (1)无名管道的操作
      • 3.管道读取数据图

一、进程间通信

  • 进程间通信的方式(ipc机制):管道、信号量、消息队列、共享内存、套接字。
  • 利用我们学过的知识完成进程间通信用到的操作:一个程序像文件中写数据,用另一个文件来读取。

    由此,如果我们能将数据写入内存中,效率将会高很多。所以我们可以用管道的方式来进行进程间通信。

1.进程间通信——管道

优点:

  • 管道是一种直接想内存中写入数据和读取数据的工具。
  • 管道是可以让读写数据进行同步控制的一种工具。

注意:

  1. 管道分为有名管道和无名管道。
  2. 写入管道的数据存储在内存中。
  3. 有名管道和无名管道的区别:有名管道可以在任意两个进程间通信,无名管道只能在父子进程间通信。
  4. 管道是一个半双工的通信方式。

(1)有名管道的创建

管道的创建有两种方式:命令式和函数式。
命令式创建管道的方式:mkfifo+管道名mkfifo fifo

图中可以看到管道文件的大小为0,无论管道中写没写数据,管道文件的大小都是0。因为管道是向内存中写数据的。

(2)有名管道的操作

管道的操作和文件的操作是相似的,都可以用读写操作对管道进行操作。

写操作

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include<fcntl.h>int main()
{int fdw=open("fifo",O_ERONLY);   assert(fdw!=-1);//正常情况下,fdr=3;printf("dfw=%d\n",fdw);while(1){char buff[128]={0};fgets(buff,128,stdin);if((strncmp(buff,"end",3)==0){break;}write(fdw,buff,strlen(buff));}close(fdw);
}

读操作

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include<fcntl.h>int main()
{int fdr=open("fifo",O_RDONLY);   //有可能阻塞住;assert(fdr!=-1);//正常情况下,fdr=3;printf("dfr=%d\n",fdr);while(1){char buff[128]={0};int n=read(fdr,buff,127);if(n==0){break;}printf("buff=%s\n",buff);}close(fdr);
}

发生阻塞和关闭程序的几种情况

  1. 正常情况下打开文件fdr和fdw的值都为3,因为0代表标准输入,1代表标准输出,2代表标准错误输出。
  2. 有名管道在读端打开的过程中有可能发生阻塞,因为有名管道是要两个进程同时打开的,并且一个进程以写的方式,一个进程以读的方式,如果只读取的话没有意义。
  3. 在读文件过程中,如果没有数据也会发生阻塞。
  4. 当管道满时,写端也会发生阻塞,等待数据读取之后再进行写入。
  5. 如果写端关闭,读端的返回值为0,读端也会关闭。

几种异常情况:

  • 当正在通过管道执行的读写程序中,写程序强制退出程序之后,读程序也会退出。
  • 当正在通过管道执行的读写程序中,读程序强制退出程序之后,写程序写入数据时,也会直接退出。因为出现异常,接受SIGPIGE信号,关闭了写端。

2.无名管道的创建

通过命令:pipe(int pipefd[2]) //pipefd[0]是读端,pipefd[1]是写端这是规定。
无名管道的图解:

(1)无名管道的操作

注意:fork和获得描述符操作不可更改顺序,因为只有在有了读写描述符之后fork,子进程才也有权限。

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include<fcntl.h>int main()
{int fd[2];int rse=pipe(fd);    //此操作之后获得读写描述符;assert(rse!=-1);pid_t pid=fork();assert(pid!=-1);if(pid==0){close(fd[1]);char buff[128]={0};read(fd[0],buff,127);printf("child read=%s\n",buff);close(fd[0]);}else{close[fd(0)];write(fd[1],"hello",5);close(fd[1]);}exit(0);
}

3.管道读取数据图

Linux下进程间通信——管道相关推荐

  1. Linux下进程间通信-------管道通信

    先来看原理: 特点 : 1.半双工的通信方式(通信期间双方都可以发送/接收文件,但是不能双方同时发送/接收数据) 2.pipe只能用于父子进程间的通信 3.mkfifo可用于任意进程间的通信 代码逐步 ...

  2. Linux下进程间通信的六种机制详解

    linux下进程间通信的几种主要手段:        1.管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具 ...

  3. Linux下进程间通信概述

    1. Linux下进程间通信概述 P83-P84 将第一页和第二页合并起来讲了 引言:前面我们学习了一下进程,我们知道多,进程间的地址空间相对独立.进程与进程间不能像线程间通过全局变量通信. 如果想进 ...

  4. linux实现单机qq_Linux后台服务器开发——Linux下进程间通信的方式有哪些?

    Linux下进程间通信的方式有: 管道 消息队列 信号 信号量 共享存储 套接字 一.管道 管道是半双工的,数据只能向一个方向流动:需要双方通信时,需要建立起两个管道 PIPE无名管道 详情参阅:ht ...

  5. Linux下进程间通信--共享内存:最快的进程间通信方式

    内存共享最新整理: Linux下进程间通信-共享内存 - 码到城攻共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式https://www.codecomeon.com/posts/109/ ...

  6. Linux下进程间通信方式之管道、信号、共享内存、消息队列、信号量、套接字

    /* 1,进程间通信 (IPC ) Inter-Process Communication比较好理解概念的就是进程间通信就是在不同进程之间传播或交换信息.2,linux下IPC机制的分类:管道.信号. ...

  7. linux下进程间管道通信,Linux下进程间通信方式-管道

    本文关键字: linux 管道通信,linux 进程通信方式,无名管道,有名管道 管道是Linux中进程间通信的一种方式,它把一个程序的输出直接连接到另一个程序的输入.Linux的管道主要包括两种:无 ...

  8. 【Linux】进程间通信--管道(匿名管道和命名管道)

    文章目录 前言 进程间通信的目的 管道 匿名管道 管道特点 站在文件描述符角度理解管道 匿名管道通信读写特点 命名管道 命名管道的原理 命名管道的创建 命名管道完成两个不同进程通信 匿名管道和命名管道 ...

  9. Windows与Linux下进程间通信技术比较

    一般我们写的程序都是以单个进程的方式来运行的,比较少涉及到多进程.特别是在windows下,因为Windows是按照线程来分配CPU时间片的,线程是最小的调度单位,所以在Windows下更多的用到多线 ...

最新文章

  1. 简单介绍python编程之文件读写
  2. QIIME 2教程. 27语义类型Semantic(2020.11)
  3. 【转】SQL存储结构(页)
  4. Hadoop详解(二):HDFS存储系统设计原理
  5. yii2 js css,JS、CSS的引用
  6. ML之DT之CART:分类与回归树CART算法的简介、应用、经典案例之详细攻略
  7. 【linux】查看字体
  8. api 定位 微信小程序 精度_一行代码区分微信小程序或QQ小程序
  9. Jupyter 安装并配置工作路径[转]
  10. 强制html元素不随窗口缩小而换行
  11. Spring AOP / AspectJ AOP 的区别?
  12. 【codevs2912】反素数,好好学习天天向上
  13. Shiro——从零开始进行详解官方入门案例
  14. 服务器修改动态磁盘,服务器动态磁盘
  15. 怎样查看域名DNS服务器的相一些关信息
  16. DiskFileUpload类
  17. 使用支付宝小程序input组件的坑
  18. Python爬虫爬取网页上的所有图片
  19. 蚂蚁森林 离线爬虫自动收能量,养小鸡,等各种操作
  20. 穿西服和穿皮鞋有那些讲究?

热门文章

  1. 所有库在门不显示封装_奈雪和石库门在一起,太上头
  2. 用微信点单 订餐系统打造属于个人的O2O外卖订餐行业商业平台
  3. WebForm开发常用代码
  4. CentOS5.4下安装短信猫
  5. 实例讲解之校园网病毒该如何铲除
  6. 网曝抖音电商变相降薪!总包不变,base降低,分摊到年终奖!
  7. 因融资失败,应用崩溃,3名程序员被“祭天”!
  8. 再有人问你MySQL是如何查询数据的,请把这篇文章甩给他!
  9. 某快手程序员吐槽:月薪四万很惶恐!和老婆亲热时都在想工作,薪资越高,做人越怂!...
  10. 我成功攻击了Tomcat服务器,大佬们的反应亮了