Linux下有名管道mkfifo使用详解

 更新时间:2023年07月10日 15:32:20   作者:hsy12342611  
有名管道用于非亲缘关系进程之间的通讯,创建有名管道使用到的库函数是mkfifo(),这里强调是库函数的原因是,mkfifo同时也是一个用户指令,这篇文章主要介绍了Linux下有名管道mkfifo使用,需要的朋友可以参考下

Linux下实现进程通信的方式有很多种,今天要说的是有名管道,有名管道比命名管道的优势是可以在任何进程之间传递数据。有名管道通信是依赖于管道文件这种特殊类型文件来进行的。

1.mkfifo命令

mkfifo命令可以创建管道文件,例如:

 如上文件类型是p代表的就是管道文件。

2.mkfifo库函数

man 3 mkfifo

 mkfifo函数是glibc库中实现的一个接口,如下利用mkfifo来实现进程之间数据传输。

server.c

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <assert.h>
#include <fcntl.h> 
#define FIFO_PATH "./fifo"
int main()
{
    umask(0);
    // 创建管道
    int ret = mkfifo(FIFO_PATH, 0666);  
    // 打开管道
    int fd = open(FIFO_PATH, O_RDONLY);                                                  
    if(fd > 0) {
      char buf[1024] = {0};
      while(1){
        //管道读取数据
        int ret = read(fd, buf, sizeof(buf) - 1);
        buf[ret] = 0;
        if(ret > 0){
            printf("%s", buf);
            fflush(stdout);
        }
        // 客户端不写入数据,则停止读取
        else if(ret == 0){
            printf("client quit\n");
            break;
        }
        else{
            perror("read filed\n");
            break;
        }
      } 
    }
    close(fd);
   return 0;
}

client.c

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <assert.h> 
#include <stdlib.h>
#define FIFO_PATH           "./fifo"
#define WRITE_TIMES         5
/*
标准输入输出错误输出 FILE*:
stdin
stdout
stderr
标准输入输出错误输出fd:
STDIN_FILENO 0
STDOUT_FILENO 1
STDERR_FILENO 2
*/
int main()
{
    //打开管道
    int fd = open(FIFO_PATH, O_WRONLY);
    char buf[64] = {0};
    int times = 0;
    while(1)
    {
        // 写入5次
        if (++times > WRITE_TIMES) {
            break;
        }
        printf("please input info :");
        fflush(stdout);
        //从标准输入获取数据写入进管道。
        ssize_t ret = read(0, buf, sizeof(buf) - 1);
        if(ret > 0){ //将读取到的数据往文件中写入
          buf[ret] = 0;
          write(fd, buf, sizeof(buf) - 1);
        }
        else {
          perror("read");
        }
    }
    close(fd);
    return 0;
}

Makefile

.PHONY: all
all: server client
server: server.c
	gcc -o $@ $^
client: client.c
	gcc -o $@ $^
.PHONY: clean
clean:
	rm server client fifo -rf

代码结构:

运行两个server进程,两个client进程

从运行结果看, 两个client进程往管道写入5段数据信息,两个server进程从管道读取数据,管道有互斥功能,同一时刻只能有一个进程从管道读取数据。

到此这篇关于Linux下有名管道mkfifo使用的文章就介绍到这了,更多相关Linux mkfifo使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • shell中exit 0和exit 1的区别有哪些

    shell中exit 0和exit 1的区别有哪些

    exit1和exit是shell中的两个命令,用于退出当前的shell进程,本文就来介绍一下shell中exit 0和exit 1有哪些区别,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • Shell脚本美化登录界面装饰图(含农历)

    Shell脚本美化登录界面装饰图(含农历)

    这篇文章主要介绍了Shell脚本美化登录界面装饰图(含农历),本文脚本实现输出一个佛祖像和农历日期,需要的朋友可以参考下
    2015-02-02
  • php在linux中可能用到的命令(推荐)

    php在linux中可能用到的命令(推荐)

    下面小编就为大家带来一篇php在linux中可能用到的命令(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • Linux 下载百度网盘大文件的方法

    Linux 下载百度网盘大文件的方法

    Linux 下没有百度网盘客户端,用浏览器下载速度慢得急死人,本文重点给大家介绍Linux 下载百度网盘大文件的方法,需要的朋友参考下吧
    2017-08-08
  • 一个简洁的全自动安装LNMP服务器环境的Shell脚本分享

    一个简洁的全自动安装LNMP服务器环境的Shell脚本分享

    这篇文章主要介绍了一个简洁的全自动安装LNMP服务器环境的Shell脚本分享,本文脚本在生产环境上使用了一年多,脚本代码简单唯美,需要的朋友可以参考下
    2014-12-12
  • Linux shell脚本的建立与执行

    Linux shell脚本的建立与执行

    今天小编就为大家分享一篇关于Linux shell脚本的建立与执行,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • 使用Bash Shell检查文件是否存在的方法

    使用Bash Shell检查文件是否存在的方法

    大多数情况下,可以使用测试命令来对条件进行测试。比如可以比较字符串、判断文件是否存在及是否可读等等。下面这篇文章就主要介绍了使用Bash Shell检查文件是否存在的方法,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-01-01
  • shell脚本实现linux系统文件完整性检测

    shell脚本实现linux系统文件完整性检测

    这篇文章主要介绍了shell脚本实现linux系统文件完整性检测,本文给出的脚本使用对比MD5的方法,检测linux系统文件是否被替换等问题,需要的朋友可以参考下
    2014-12-12
  • Shell编程中while与for的区别及用法详解

    Shell编程中while与for的区别及用法详解

    在shell编程中经常用到循环,常用的循环有for和while循环两种。while循环默认以行读取文件,而for循环以空格读取文件切分文件,本篇就结合现网的一些使用示例说说二者的用法和区别
    2016-02-02
  • 一个强大的网络分析shell脚本分享(实时流量、连接统计)

    一个强大的网络分析shell脚本分享(实时流量、连接统计)

    这篇文章主要介绍了一个强大的网络分析shell脚本分享,此脚本包含实时流量统计、连接统计强大功能,需要的朋友可以参考下
    2014-12-12

最新评论