进程间通信IPC——命名管道

2023-05-16

命名管道

    • 1、基本概念
    • 2、创建
      • 1)命令行
      • 2)函数
    • 3、示例

1、基本概念

命名管道是一种特殊的文件类型,其存在于磁盘上,但是大小永远是0。
不同于匿名管道的是:

  • 可在同一台计算机的不同进程之间或在跨越网络的不同计算机的不同进程之间实现通信
  • 支持可靠的、单向或双向的数据通信
  • 命名管道只是让两个无关的进程之间建立起联系,一旦关系建立起来,与命名管道的文件不再有关
  • 命名管道FIFO(first input first output)总是遵循先进先出的原则,即第一个进来的数据会第一个被读走
  • 命名管道可以一个读端,多个写端;也可以多个写端,一个读端

服务器建立命名管道时给它指定一个名字,任何进程都可以通过该名字打开管道的另一端,根据给定的权限和服务器进程通信。

2、创建

1)命令行

通过执行以下命令即可创建命名管道:

mkfifo fifo_file_name

fifo_file_name 是要创建的命名管道文件名称。
在这里插入图片描述
如上图所示,可以看到命名管道fifo1,其大小为0

2)函数

#include<sys/types.h>
#include<sys/stat.h>

int mkfifo(const char* filename, mode_t mode)

返回:
    成功:0
    失败:-1
参数:
	filename:创建的命名管道名称
	mode:命名管道的读写模式,与open函数中的mode相同
		O_RDONLY: 只读打开
    	O_WRONLY: 只写打开
    	O_RDWR : 读,写打开
    	这三个常量,必须指定一个且只能指定一个

命名管道创建完成后就可以使用,其使用方法与管道一样,区别在于:命名管道使用之前需要使用open()打开。
这是因为:命名管道是设备文件,它是存储在硬盘上的,而管道是存在内存中的特殊文件。

但是需要注意的是

  • 命名管道调用open()打开有可能会阻塞,但是如果以读写方式(O_RDWR)打开则一定不会阻塞;
  • 以只读(O_RDONLY)方式打开时,调用open()的函数会被阻塞直到有数据可读;
  • 如果以只写方式(O_WRONLY)打开时同样也会被阻塞,直到有以读方式打开该管道

3、示例

/*************************************************************************
    > File Name: read_fifo.c
    > Describe: 命名管道测试文件->读取文件
    > Author: hang
    > Mail: zhzl1218@foxmail.com 
    > Created Time: Thu 27 Feb 2018 08:19:34 PM CST
 ************************************************************************/

#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<unistd.h>

int main()
{
    int fd;
    int len;
    char buf[1024];
    if(mkfifo("fifo1", 0666) < 0 && errno!=EEXIST) // 创建FIFO管道
        perror("Create FIFO Failed");

    if((fd = open("fifo1", O_RDONLY)) < 0)  // 以读打开FIFO
    {
        perror("Open FIFO Failed");
        exit(1);
    }
    while((len = read(fd, buf, 1024)) > 0) // 读取FIFO管道
    {
        printf("Read message: %s", buf);
    }
    close(fd);  // 关闭FIFO文件
    
    return 0;
}
/*************************************************************************
    > File Name: write_fifo.c
    > Describe: 匿名管道测试文件->输入文件 
    > Author: hang
    > Mail: zhzl1218@foxmail.com 
    > Created Time: Thu 27 Feb 2018 08:17:26 PM CST
 ************************************************************************/

#include<stdio.h>
#include<stdlib.h>   // exit
#include<fcntl.h>    // O_WRONLY
#include<sys/stat.h>
#include<time.h>     // time
#include<unistd.h>

int main()
{
    int fd;
    int n, i;
    char buf[1024];
    time_t tp;
    printf("I am %d process.\n", getpid()); // 说明进程ID
    
    if((fd = open("fifo1", O_WRONLY)) < 0) // 已写打开一个FIFO
    {
        perror("Open FIFO Failed");
        exit(1);
    }
    for(i=0; i<20; ++i)
    {
        time(&tp);  // 取系统当前时间
        n=sprintf(buf,"Process %d's time is %s",getpid(),ctime(&tp));
        printf("Send message: %s", buf); // 打印
        if(write(fd, buf, n+1) < 0)  // 写入到FIFO中
        {
            perror("Write FIFO Failed");
            close(fd);
            exit(1);
        }
        sleep(1);  // 休眠1秒
    }
    close(fd);  // 关闭FIFO文件
    return 0;
}

程序运行结果:
在这里插入图片描述
在这里插入图片描述
上述例子可以扩展成 客户进程—服务器进程 通信的实例,write_fifo的作用类似于客户端,可以打开多个客户端向一个服务器发送请求信息,read_fifo类似于服务器,它适时监控着FIFO的读端,当有数据时,读出并进行处理:
在这里插入图片描述

参考:
1.《UNIX环境高级编程》
2.《UNIX网络编程》

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

进程间通信IPC——命名管道 的相关文章

随机推荐

  • 安装node,更改全局安装包的位置,以及配置环境变量

    这里改成自己建立的文件夹路径 xff0c 然后选择Add to PATH xff1a 这个会自动创建系统的环境变量 也就是上一步选择的 安装node到哪个文件夹的 那一个路径 xff0c 会自动添加到系统的环境变量中 xff1b 如下 xf
  • admin Tips

    1 获取 当前浏览器 url span class token keyword new span span class token function URL span span class token punctuation span wi
  • 知识库 tips

    1 点击标签 下载静态文件 xff1b pdf
  • vue tree select 组件 7个

  • LXC介绍

    LXC LXC又名Linux container xff0c 是一种虚拟化的解决方案 xff0c 这种是内核级的虚拟化 主流的解决方案Xen KVM LXC 介绍 通过namespace进行资源的隔离 Gust1下的进程与Guset2下的进
  • js中 offsetLeft图解

    1假设本图有三层div盒子 外 中 内 2最外层和页面的距离就是offsetLeft 元素与页面之间的左边的距离 3外层包含着中 和内 4外层和中层的距离是不变的 外层包含中层 xff0c 中层的offsetLeft是相对于外层的距离 5若
  • LAMP源码安装图文详解(超详细)

    文章目录 一 LAMP架构概述1 各组件的主要作用2 各组件安装顺序 二 编译安装Apache httpd服务1 关闭防火墙 xff0c 将安装Apache所需软件包传到 opt目录下2 安装环境依赖包3 配置软件模块4 编译及安装5 优化
  • c++学习总结(多态性)

    在学习c 43 43 的过程中 xff0c 根据自己的见解 xff0c 把一些自己认为重要的 容易混淆的知识点记录下来 xff0c 为了以后能够复习 今天主要总结多态性 主要从以下三个方面来讨论 xff1a what why how 什么是
  • [分享]分享一个多旋翼开源飞控项目

    https github com golaced Oldx fly controller tree rmd OLDX多旋翼开发平台 xff08 OLDX FC xff09 是由北京理工大学自动化学院所属 北理云逸科技 团队开发的一个目前国内
  • gitkraken安装教程

    版本gitkraken6 5 1 双击安装文件后 xff0c 安装成功后 xff0c 关掉软件 xff0c 删掉安装包 第一步 xff1a 修改hosts xff0c 路径为C Windows System32 drivers etc ho
  • 入手新单片机流程&提高可移植性的编程技巧

    现在单片机种类众多 xff0c 各有各的优势与不足 体现在价格 速度 外设 功耗 封装等许多方面 xff0c 这些单片机不可能一一去学习 xff0c 因此今后有很大可能需要应用到自己不熟的单片机 xff0c 对此 xff0c 我总结了一些经
  • ssh连接失败,但能ping通服务器

    ssh连接失败 xff0c 但能ping通服务器 问题描述问题排查1 判断是否客户端本身问题2 服务器端排查3 配置完服务器报错 问题描述 能ping通 xff0c ssh报错 Connection reset by peer span c
  • opencv库的功能

    OpenCV Open Source Computer Vision 是一个开源的计算机视觉库 xff0c 提供了很多用于图像处理 计算机视觉 机器学习等方面的函数和工具 以下是一些 OpenCV 库的功能 xff1a 图像和视频 I O
  • 深度学习模型列举

    深度学习是一种人工神经网络算法的实现方式 xff0c 主要用于处理大规模复杂数据集 xff0c 如图像 语音 文本等数据 以下是一些常见的深度学习模型 xff1a 卷积神经网络 xff08 Convolutional Neural Netw
  • CentOS8.3.2011无法联网解决方案

    1 切换到ifcfg ensXX目录下 cd etc sysconfig network scripts 2 编辑ifcfg ensXX文件 vim ifcfg ens33 3 修改 BOOTPROTO 61 dhcp 并且修改 ONBOO
  • Run Windows in Ubuntu with VMware Player 使用 VMware Player 在 Ubuntu 下运行 Win

    Are you an enthusiast who loves their Ubuntu Linux experience but still needs to use Windows programs Here s how you can
  • Ardupilot固定翼无人机L1制导律原理及代码解读

    L1制导律是固定翼无人机飞行路径跟踪的重要算法之一 xff0c 这个算法由MIT的研究人员提出 在这之前 xff0c 无人机进行路径跟踪一般采用基于侧偏距的PD控制器方法 至于为什么使用PD而不使用PID xff0c 那是因为位置环响应慢
  • sumo交通流仿真软件的使用说明

    1 安装流程 xff1a 1 xff09 mis文件安装 xff1a 官网下载下来一键安装 xff1b 2 xff09 tar利用压缩安装 xff1a 官网下载安装包 xff0c 解压后 xff0c 在系统变量变量中定义sumo的路径和bi
  • 搭建PX4开发环境

    PX4是著名的开源无人机开发平台 xff0c 它提供了一个虚拟环境 xff0c 可以用来验证无人机的飞控算法 xff0c 也可以连接开源硬件 xff0c 为无人机的开发提供了极大便利 目前PX4支持的操作系统是ubuntu 18 04LTS
  • 进程间通信IPC——命名管道

    命名管道 1 基本概念2 创建1 xff09 命令行2 xff09 函数 3 示例 1 基本概念 命名管道是一种特殊的文件类型 xff0c 其存在于磁盘上 xff0c 但是大小永远是0 不同于匿名管道的是 xff1a 可在同一台计算机的不同