首页 > 其他分享 >有名管道(FIFO)

有名管道(FIFO)

时间:2023-04-29 09:44:46浏览次数:18  
标签:mkfifo fifo1 FIFO int 管道 有名 str include fifofd

# 父子进程之间示例

/*
    有名管道(FIFO)
        提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中
        读写操作和普通文件一样,常用于不存在关系的进程之间

    注意事项:
        读写进程只要有一端未打开,另一打开的一端就会阻塞在read或write处
        当两端都打开,其中一端关闭时,另一端也停止

    通过命令创建有名管道
        mkfifo 名字
    
    通过函数创建有名管道
        #include <sys/types.h>
        #include <sys/stat.h>

        int mkfifo(const char *pathname, mode_t mode);
            参数:
                pathname:路径
                mode:权限,和open一样,八进制
            返回值:
                成功:0
                失败:-1

*/


// 父子进程之间
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

int main()
{

    if(access("fifo1", F_OK) == 0)
    {
        remove("fifo1");

    }


    int mkfifo_flag = mkfifo("fifo1", 0777);

    if(mkfifo_flag == -1)
    {
        perror("mkfifo");
        exit(-1);
    }
    int fifofd = open("fifo1", O_RDWR);

    int fork_flag = fork();
    if(fork_flag == 0)
    {
        char str[1024];
        strcpy(str, "Hello World");

        write(fifofd, str, strlen(str));
    }
    else
    {
        char str[1024];
        read(fifofd, str, sizeof(str));

        printf("parent recv a info : %s \n", str);


    }





}

 

# 无关联进程之间示例

write.c

// 无关系进程之间
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

int main()
{

    if(access("fifo1", F_OK) == 0)
    {
        remove("fifo1");

    }


    int mkfifo_flag = mkfifo("fifo1", 0777);

    if(mkfifo_flag == -1)
    {
        perror("mkfifo");
        exit(-1);
    }
    int fifofd = open("fifo1", O_WRONLY);

    for(int i = 0; i < 10; i++)
    {
        char str[1024];
        sprintf(str, "Hello : %d", i);
        write(fifofd, str, strlen(str));
        sleep(1);
    }
    close(fifofd);


    return 0;


}

 

read.c

// 无关系进程之间
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

int main()
{

    // if(access("fifo1", F_OK) == 0)
    // {
    //     remove("fifo1");

    // }


    // int mkfifo_flag = mkfifo("fifo1", 0777);

    // if(mkfifo_flag == -1)
    // {
    //     perror("mkfifo");
    //     exit(-1);
    // }
    int fifofd = open("fifo1", O_RDONLY);

    while(1)
    {
        char str[1024] = {0};  //读端接收字符串初始化为0,可防止输出乱码
        int len = read(fifofd, str, sizeof(str)); // 写端关闭时,len == 0
        if(len == 0)
        {
            printf("写端断开连接了......\n");
            break;
        }
        printf("read file recve a info : %s\n", str);
    }
    close(fifofd);







    
    return 0;


}

 

标签:mkfifo,fifo1,FIFO,int,管道,有名,str,include,fifofd
From: https://www.cnblogs.com/WTSRUVF/p/17363592.html

相关文章

  • 掰开揉碎讲 FIFO
    一、什么是FIFOFIFO是FirstInFirstOut的简称。是指在FPGA内部用逻辑资源实现的能对数据的存储具有先进先出特性的一种缓存器。FIFO与FPGA内部的RAM和ROM的区别是FIFO没有外部读写地址线,采取顺序写入数据,顺序读出数据的方式,其数据地址由内部读写指针自动加1完成。......
  • 为什么FIFO 第一轮读出数据正确,第二轮读出数据的时候读出的是x?FIFO 读出数据有误
    仿真如下所示,第一轮写入12345678读出来都是对的,后来写9 1011...等,读出来就是x了,这是为什么呢?  这说明指针在指到FIFO尽头以后出了什么问题。。。。。 最后发现是这里指针的位宽是3,结果定义为了4位,这样的话,当你指针累计到111的时候并没有返回到000,而是指到......
  • Django之路由层 (有名和无名分组 反向解析 路由分发 名称空间)
    目录一、路由匹配django2.X及以上path第一个参数写什么就匹配什么django1.X第一个参数是正则表达式PS:无论什么版本django都自带加斜杠后缀的功能也可以取消,这里如果在浏览器地址栏没有写完整的/index/,而是/index,这里还是可以找到的,因为Django会帮你二次查找,浏览器会有303......
  • 进程间的通信方式——pipe(1、管道)
    本章内容采用pipe管道如何进行进程之间的通信pipe管道进程通信的规则和限制Linux中pipe管道的实现机制和管理pipe管道的结构体什么是进程通信进程通信就是两个进程之间进行数据交换,在Linux中有好几种可以进行进程通信的方式,在这篇文章中我们主要介绍最基本的进程通信方式——pipe管......
  • 为什么再html页面引用element复选框,只有名称值,没有复选框
    问题描述我引入了el-checkbox之后,发现浏览器页面只是显示里面的文字,并没有显示出来我想要看到的相应样式问题解决经过一定的百度查证可知,使用Element-UI组件时,我们需要用div标签将其包裹起来;然后使用script标签定义一下div里面的id属性,然后才能够引用到这个el-标签,让其中的样......
  • 无名管道
    #include"stdio.h"#include"unistd.h"#include"string.h"intmain(void){intpipefd[2];//创建无名管道,pipefd[0]读端pipefd[1]写端if(pipe(pipefd)==-1){perror("pipe");}intpid=fork();......
  • Redis Pipeline(管道)
    RedisPipeline简介Redis是一种基于客户端-服务端模型以及请求/响应的TCP服务。一次Redis客户端发起的请求,经过服务端的响应后,大致会经历如下的步骤:客户端发起一个(查询/插入)请求,并监听socket返回,通常情况都是阻塞模式等待Redis服务器的响应服务端处理命令,并且返回处理结果......
  • 为什么html页面不能显示标签el-checkbox的多选框,只有名称值
    问题描述我引入了el-checkbox之后,发现浏览器页面只是显示里面的文字,并没有显示出来我想要看到的相应样式问题解决经过一定的百度查证可知,使用Element-UI组件时,我们需要用div标签将其包裹起来;然后使用script标签定义一下div里面的id属性,然后才能够引用到这个el-标签,让其中的样......
  • 操作系统试验-进程间通信:借鉴生产者-消费者示例程序,利用FIFO或消息队列实现操作系统中
    实验名称操作系统试验-进程间通信实验目的借鉴生产者-消费者示例程序,利用FIFO或消息队列实现操作系统中的经典生产者-消费者问题,要求:1、仓库有26个存储单元;2、具有两个以上的生产者与消费者;3、生产者和消费者以随机的方式对仓库进行访问;4、在任意时刻,仓库里面只有一个进程;5、仓库满......
  • 数据管道
     [Eatsdataplatform:Empoweringbusinesseswithdata](https://medium.com/coupang-engineering/eats-data-platform-empowering-businesses-with-data-3cc00fa9968d)[Eatsdataplatform:Servicesformachinelearningandaudiencesegmentation](https://medium.com......