进程间的通信IPC介绍
进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。

IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket和Streams支持不同主机上的两个进程IPC。
一、管道
管道,通常指无名管道,是 UNIX 系统IPC最古老的形式。
(1)特点:

它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。

(2)原型:

#include <unistd.h>
int pipe(int pipefd[2]);
// 返回值:若成功返回0,失败返回-1

当一个管道建立时,它会创建两个文件描述符:fd[0]为读而打开,fd[1]为写而打开。要关闭管道只需将这两个文件描述符关闭即可。

#include<stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main()
{//int pipe(int pipefd[2]);int fd[2];//两个文件描述符pid_t pid;char *readbuf=NULL;readbuf=(char*)malloc(128);if(pipe(fd)==-1){//创建管道printf("creat pipe fail\n");}pid=fork();if(pid<0){printf("creat child fail\n");}else if(pid>0){sleep(3);printf("this is father\n");close(fd[0]);write(fd[1],"hello from father",strlen("hello from father"));wait(NULL);}else{printf("this is child\n");close(fd[1]);read(fd[0],readbuf,128);printf("read from father is %s\n",readbuf);exit(-1);
}

二、FIFO
FIFO,也称为命名管道,它是一种文件类型。

特点:

FIFO可以在无关的进程之间交换数据,与无名管道不同。FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中。

原型:

#include <sys/stat.h>
// 返回值:成功返回0,出错返回-1
int mkfifo(const char *pathname, mode_t mode);

其中的 mode 参数与open函数中的 mode 相同。一旦创建了一个 FIFO,就可以用一般的文件I/O函数操作它。pathname是文件名(管道名)。

当 open 一个FIFO时,是否设置非阻塞标志(O_NONBLOCK)的区别:

若没有指定O_NONBLOCK(默认),只读 open 要阻塞到某个其他进程为写而打开此 FIFO。类似的,只写 open 要阻塞到某个其他进程为读而打开它。若指定了O_NONBLOCK,则只读 open 立即返回。而只写 open 将出错返回 -1 如果没有进程已经为读而打开该 FIFO,其errno置ENXIO。

写端代码

#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include<errno.h>
#include <fcntl.h>
#include<string.h>
int main()
{//int mkfifo(char*pathname,mode_t mode);int fd;int cnt=0;char*str="message from file";fd=open("./file",O_WRONLY);while(1){write(fd,str,strlen(str));sleep(1);if(cnt==5){break;}}close(fd);printf("write open successful\n");return 0;
}

读端代码

#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include<errno.h>
#include <fcntl.h>
int main()
{//int mkfifo(char*pathname,mode_t mode);int fd;int nread=0;char buf[30]={0};if(mkfifo("./file",0600)==-1&& errno!=EEXIST){printf("mkfifo fail\n");perror("why");}fd=open("./file",O_RDONLY);//fd=open("./file",O_RDONLY|O_NONBLOCK);非堵塞方式打开printf("open successful\n");while(1){nread=read(fd,buf,20);//若没有写端将会堵塞在这里printf("read %d byte from file,context is%s\n",nread,buf);}close(fd);return 0;
}

详细介绍

进程间的通信IPC(无名管道和命名管道)相关推荐

  1. Linux_进程间通信(进程间通信,匿名管道,命名管道)

    文章目录 1.进程间通信 1.1 进程间通讯概述 1.2 进程间通信目的 1.3 进程间通信分类 2. 管道 2.1 概述 2.2 匿名管道 2.2.1 概述 2.2.2 创建匿名管道 2.2.3 基 ...

  2. 进程间的通信——无名管道

    进程间的通信--无名管道 宗旨:技术的学习是有限的,分享的精神是无限的. 一.进程间的通信 (1)同主机进程间数据交互机制:无名管道(PIPE),有名管道(FIFO).消息队列和共享内存.无名管道多用 ...

  3. 2022.8.31 进程中无名管道的特点,无名管道的创建,为何无名管道只能能够实现具有亲缘关系的进程间的通信,以及实现利用无名管道父进程给子进程发送消息的完整代码。

    无名管道通信 无名管道特点: (1):只能用于具有亲缘关系的进程之间的通信.(父子进程或兄弟进程) (2):是一个半双工的通信模式,具有固定的读端和写端.(fd[0]固定为读端,fd[1]固定为写端) ...

  4. 深刻理解 Linux 进程间七大通信(IPC)

    前言 网络编程是 Linux C/C++的面试重点,今天我就来聊一聊进程间通信的问题,文章末尾列出了参考资料,希望帮助到大家. 篇幅有点长,希望大家耐心阅读. Linux 下的进程通信手段基本上是从 ...

  5. 进程间的通信(二)命名管道fifo

    在linux下我们先通过一个实例来说明一下mkfifo 的作用, 然后再看mkfifo 的使用详解 # mkfifo myfifo # ping edu.cn >> myfifo 另开一个 ...

  6. 网络编程之 进程间的通信之管道的使用

    如何使用管道是进程间通信的关键 博主先声明一下,关于处理进程创建以及销毁的方法.        "子进程究竟何时终止????调用waitpid函数后还要无休止的等待子进程终止吗???&quo ...

  7. 命名管道(FIFO) Linux进程进程间的通信之命名管道(FIFO)

    Linux进程进程间的通信之命名管道(FIFO) 命名管道(FIFO),它和一般的管道一样.都是作为中间的邮递员来实现两个进程间的通信交流. 命名管道(FIFO)有几个特点: 1.命名管道(FIFO) ...

  8. 【操作系统】进程间的通信——管道

    进程间的通信-管道 管道 进程间的通信(IPC-Inter-Process Communication)有多种方式,管道是其中最基本的方式. 管道是半双工的,即是单向的. 管道是FIFO(先进先出)的 ...

  9. Linux进程通信——匿名管道、命名管道、管道的特性和共享内存

    Linux进程通信--匿名管道.命名管道.管道的特性和共享内存 一.管道 1.1 什么是管道? 1.2 匿名管道 <1> 匿名管道参数说明 <2> fork共享管道原理 < ...

最新文章

  1. 你需要掌握的有关.NET DateTime类型的知识点和坑位 都在这里
  2. cuda10安装_Win10安装GPU版本的Tensorflow 2.1
  3. 启明云端分享|ESP32/ESP8266 烧录器 USB-TTL转接板开发工具ESP-T01的使用教程,视频可参考B站
  4. 透明色代码是多少_北京宣传画册印刷多少钱
  5. Windows 8.1 build 9369 简单安装测试了一下
  6. 吴恩达发起新型竞赛范式!模型固定,只调数据?!
  7. 吉林大学 计算机图形学,吉林大学计算机图形学资料汇总.doc
  8. Git学习(1)-本地版本库的创建
  9. SDUT 2142 数据结构实验之图论二:基于邻接表的广度优先搜索遍历
  10. 2022年新版YOLO解读(PP-YOLOE)
  11. 全网首发:GB18030中,蒙文的错误
  12. 【java期末复习题】第15章 JDBC数据库编程
  13. 用 windows 资源监视器 查看 被占用的文件
  14. 无法阻止的电竞热潮-用电竞连接世界
  15. 中国DNA测序在药物发现市场中的应用市场深度研究分析报告
  16. c语言 老鼠乘法,c语言-老鼠走迷宫逐步理解
  17. HTML5+app开发学习之调试篇
  18. 字符串相乘——大整数乘法
  19. 那些让你起飞的计算机基础知识!
  20. java多线程 丢数据_多线程list.add()丢数据

热门文章

  1. 【数据结构】——快速排序
  2. php运行代码运行退出为0,php – Selenium测试用例返回进程以退出代码0结束
  3. python调用摄像头人脸识别代码_利用face_recognition,dlib与OpenCV调用摄像头进行人脸识别...
  4. html5监听动画结束,js判断css动画是否完成 animation,transition
  5. cad.net 获取所有已经安装的cad版本信息
  6. POJ 2054 Color a Tree (贪心)
  7. Unity 内建数据索引
  8. POJ 2676/2918 数独(dfs)
  9. Jar 打包 EXE文件,可以脱离java环境运行 Jsmooth的使用
  10. 使用selector改变按钮状态