浅析Linux进程间通信方式之管道——有名管道

关于FIFO

FIFO(First In, First Out)是一种数据结构,用于管理数据的存储和访问顺序。它基于先进先出的原则,即最先进入的数据最先被处理或访问,在有名管道中常用。


本质

一段特殊的内存,也可以说是一种特殊文件,其内容在内存中,文件系统可以找到文件名。


特点

  1. 半双工,数据在同一时刻只能在一个方向上流动(可以认为是一根普通水管,在一个时刻内,管内的水流只能向一个方向流动);
  2. 写入FIFO中的数据遵循先入先出的规则,类似队列;
  3. FIFO传送的数据无格式,这就需要读出方与写入方提前确认好数据格式(例如数据类型、多少个字节算一个消息段);
  4. FIFO在文件中作为一个特殊文件(仿文件)而存在,但FIFO的内容存放在内存中
  5. 管道中存在一段缓冲区(可以认为这一段水管的长度),其长度由系统决定;
  6. 从FIFO读取数据是一次性的,一旦数据被读取,就从FIFO中被抛弃;
  7. 当使用FIFO的进程退出后,FIFO文件将继续保存在文件系统中以便以后使用(建议在一个文件夹中建立的管道不要重名);
  8. FIFO有名字,不相关进程也可通过管道进行通信(跟无名管道最大的区别)。

函数原型

//FIFO文件的创建
#include<sys/types.h>
#include<sys/stst.h>
int mkfifo(const char*pathname,mode_t mode);

参数:
    pathname:FIFO的路径名+文件名
    mode:mode_t类型的权限描述符
返回值:
    成功:返回 0
    失败:如果文件已存在,则会出错且返回 -1

使用范例

send.c

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
int main()
{
    //创建管道fifo设置权限777(可读可写可执行)
    int ret=mkfifo("./fifo",0777);
    //如果创建失败打印错误
    if(ret == -1)
        perror("mkfifo");
    //以可读可写的方式打开管道
    int fd = open("./fifo",O_RDWR);
    //向管道写入内容
    write(fd,"hello",sizeof("hello"));
    close(fd);
    return 0;
}

rcv.c

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
int main()
{
    //创建管道fifo设置权限777(可读可写可执行)
    int ret=mkfifo("./fifo",0777);
    //如果创建失败打印错误
    if(ret == -1)
        perror("mkfifo");
    //以可读可写的方式打开管道
    int fd = open("./fifo",O_RDWR);
    //从管道读出内容
    char buf[64] = "";
    read(fd,buf,sizeof(buf));
    printf("buf = %s\n",buf);
    close(fd);
    return 0;
}

运行结果


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞翔的杨先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值