文章目录

  • 前言
  • 一、无名管道
    • 1.概念介绍
    • 2.相关函数介绍
    • 3.关于无名管道的一些说明
    • 4.无名管道编程实战
  • 二、有名管道
    • 1.概念
    • 2.编程实战
  • 总结

前言

在进程间通信的几种方式中,管道可谓是最简单的了,今天我们就来介绍一下两种管道的用法。

一、无名管道

1.概念介绍

无名管道和有名管道是Linux系统内核的特殊文件,用于进程之间的通信。
无名管道相当于一个队列结构,fd[1]为写入端(入队),fd[0]为读出端(出队)。其中信息读出后即删除,再次读取时即为下一个信息。

2.相关函数介绍

函数形式:int pipe(int fd[2])

功能:创建无名管道文件。无名管道是一个特殊文件,不可由open函数创建。

参数:fd[2]有两个成员 fd[0]和 fd[1],他们都是文件描述符。 管道有固定的读端 fd[0]和固定的写端 fd[1]。

返回值:成功返回 0,出错返回-1。

3.关于无名管道的一些说明

①管道是创建在内存中,进程结束空间释放,管道不复存在。

②无名管道和有名管道都是半双工通信,实现双向通信需要建立两个管道。

③无名管道是linux特殊文件,不能在与windows共享的文件夹中创建。

④无名管道只用于父子进程之间,有名管道可用于无亲缘关系的进程之间

4.无名管道编程实战

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>int main()
{int fd[2];int pid;char buf[128];if(pipe(fd)==-1){printf("creat pipe failur\n");//创建一个无名管道}pid=fork();//获取fork后的pid号if(pid<0){printf("creat child failur\n");}else if(pid>0){sleep(3);printf("thid is father\n");close(fd[0]);write(fd[1],"wencai love pingping",strlen("wencai love pingping"));//将要传递的数据写入fd这个数组中wait();//父进程等待子进程}else{printf("this is child\n");close(fd[1]);read(fd[0],buf,128);//读取管道中的数据printf("read from father:%s\n",buf);exit(0);}return 0;}

无名管道在进行通信时不能同时读写,因而在读的这一段需关闭写,而在写的一端则需关闭读,下面我们来看看程序运行后的实际效果

可以看到通过无名管道成功的将一串字符串从父进程传递到了子进程。

二、有名管道

1.概念

有名管道是一种文件类型,在文件系统中可以看到。程序中可以查看文件stat结构中st_mode成员的值来判断文件是否是FIFO文件。创建一个FIFO文件类似于创建文件,FIFO文件就像普通文件一样。FIFO中可以很好地解决在无关进程间数据交换的要求,并且由于它们是存在于文件系统中的,这也提供了一种比匿名管道更持久稳定的通信办法。

FIFO的通信方式类似于在进程中使用文件来传输数据,只不过FIFO类型文件同时具有管道的特性。在数据读出时,FIFO管道中同时清除数据。在shell中mkfifo命令可以建立有名管道,下面通过编程实战来帮助读者理解FIFO。

2.编程实战

有名管道一般用的多的是令其堵塞,因而在创建管道后开始读取时,需要另一进程进行写,才能正确读取到。
创建有名管道编程及写入数据:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>int main()
{int fd;int n_write;int cnt;cnt=0;char *str="wencai love pingping";//要发送的数据,可自己决定fd=open("./file1",O_WRONLY);printf("open sucesess\n");while(1){n_write=write(fd,str,strlen(str));sleep(1);cnt++;if(cnt==4){break;}}close(fd);return 0;}

读取管道中的数据:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>int main()
{int fd;int n_read;int cnt=0;char buf[30]={0};if((mkfifo("./file1",0600)==-1)&&errno!=EEXIST){  //查看是否有创建成功的管道printf("creat failuer\n");perror("why");}fd=open("./file1",O_RDONLY);printf("open sucesess\n");while(1){memset(buf,'\0',sizeof(buf));//清空收到的消息n_read=read(fd,buf,30);//读取管道中的数据printf("read %d byte from,context:%s\n",n_read,buf);if(cnt++==4){break;}}close(fd);return 0;}

然后我们在liunx平台下检查代码的运行效果

可以看到,通过写入与读取操作,我们完成了在两个不同进程间的通信

总结

管道是liunx平台下最古老的进程间通信的方式,虽然目前已经有了其他多种进程间通信的方式,但对于管道的学习还是有必要的。

有名管道和无名管道的介绍相关推荐

  1. linux系统调用创建无名管道,linux 无名管道pipe和有名管道FIFO

    1.管道(pipe) 管道是进程间通信的主要手段之一.一个管道实际上就是个只存在于内存中的文件,对这个文件的操作要通过两个已经打开文件进行,它们分别代表管道的两端.管道是一种特殊的文件,它不属于某一种 ...

  2. 管道——(1)有名管道和无名管道

    一.引子 之前,两个进程间要发送消息,是通过信号来完成的.创建通知事件,通过它引起响应,但是传送的信息只是一个信号值而已. 如果两个进程需要交换更有用.复杂的信息,就需要用到--管道. 管道--一个进 ...

  3. 【Linux】管道文件(有名管道、无名管道)

    [Linux]管道文件(有名管道.无名管道) 多进程编程的目的就是为了同时完成多个任务. 例如:一个产品,一个软件,需要n个进程同时执行才能完成,而这些进程之间一定是有所联系的. 因此:多进程工作时, ...

  4. linux管道文件的实现原理,管道(无名管道)通信机制原理和实现详解

    管道(pipe)允许两个进程进行通信,是早期 UNIX 系统最早使用的一种IPC 机制.管道为进程之间的相互通信提供了一种较为简单的方法,尽管也有一定的局限性. 在实现管道时,应该考虑以下四个问题: ...

  5. 17、有名管道与无名管道之间的区别

    1)无名管道:管道是半双工的,数据只能向一个方向流动:需要双方通信时,需要建立起两个管道:只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程). 单独构成一种独立的文件系统:管道对于管道两端的进程而 ...

  6. 有名管道和无名管道的区别

    1)无名管道:管道是半双工的,数据只能向一个方向流动:需要双方通信时,需要建立起两个管道:只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程). 单独构成一种独立的文件系统:管道对于管道两端的进程而 ...

  7. Linux有名管道与无名管道简介

    无名管道 无名管道是最古老的进程通信方式, 有如下两个特点: 1. 只能用于有关联的进程间数据交互, 如父子进程, 兄弟进程, 子孙进程, 在目录中看不到文件节点, 读写文件描述符存在一个 int 型 ...

  8. pipe 半双工_linux进程间通讯之管道(无名管道pipe)实现全双工双向通讯

    管道是什么: 1. 管道只能用于具备亲缘关系的进程之间通讯. 2.管道是一种单工或者说半双工的通讯方式,传递信息的方向是固定的,只能由一端传递到另外一端. 头文件及函数原型: #include int ...

  9. Linux 3.进程间通信(IPC)(pipe 无名管道、mkfifo 有名管道、ftok、msgget、msgrcv、msgsnd、msgctl 消息队列)

    Linux 3.进程间通信(IPC) 进程间通信: 进程间方式: pipe 管道(无名管道) 头文件及原型 特点 pipe 示例 FIFO(有名管道) 管道文件的创建 mkfifo 头文件及原型 mk ...

最新文章

  1. UDP转TCP隧道工具udptunnel
  2. 《C++ Primer》13.1.6节练习(部分)
  3. printf 规定数据输出方式
  4. 3、Fiddler 如何捕获Firefox的会话
  5. mysql-查询一天,一周,一月,一年,以及mysql的基本日期函数
  6. 2000条你应知的WPF小姿势 基础篇57-62 依赖属性进阶
  7. C# MES系统结构梳理
  8. ISO 4217 货币(货币符号)及基金编码
  9. STM32F103_study57_The punctual atoms(STM32 Port multiplexing and remapping configuration)
  10. 前端项目 - 论坛信息管理系统(纯页面)
  11. 硬盘知识:硬盘中蓝盘、绿盘、黑盘、红盘有什么区别?
  12. JAVA-打印星号三角形
  13. 计算机技术在法学方面的应用,现代计算机技术为法学带来了什么-西安交通大学教师个人主页.PDF...
  14. anaconda安装及配置
  15. 让vim编辑器显示行号
  16. 爱尔眼科跌超11%,葛兰管理的中欧医疗健康混合基金产品重仓股
  17. ADS16488驱动的软硬件设计以及ROS的驱动
  18. iOS面试:主线程如何进行阻塞?
  19. win10安装mysql5.7缺少MSVCP120.dll
  20. 【Android】Installed Build Tools revision _.0.0 is corrupted

热门文章

  1. JavaScript的BOM模型与DOM模型
  2. (三)springcloud 消息总线-spring cloud bus
  3. BCM以太网驱动初始化简要
  4. JASS萌新学习指南(1.1)
  5. 动态规划状态机模型:股票买卖I
  6. 云计算初探2-使用云服务器快速搭建论坛
  7. linux--从实验中理解keepalived高可用
  8. 移动、联通、电信三网接入要求源进源出。-三层
  9. SHA256withRSA密钥加签
  10. win10 ping命令与telnet命令使用详解