Linux应用编程---7.有名管道

news2024/11/18 22:42:14

Linux应用编程—7.有名管道

7.1 mkfifo函数详情

​ 无名管道用于具有亲缘关系的进程之间通讯,比如:父子进程、兄弟进程。有名管道用于非亲缘关系进程之间的通讯。创建有名管道使用到的库函数是:mkfifo(),这里强调是库函数的原因是,mkfifo同时也是一个用户指令。使用man 查看时,如果不加选项,如:man mkfifo,则打开的是用户指令详情页。在man后面加上选项,如:man 3 mkfifo,则打开的是Linux编程手册,是创建有名管道的库函数。

image-20221126095257525

图1 mkfifo函数详情
NAME
       mkfifo, mkfifoat - make a FIFO special file (a named pipe)

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

       int mkfifo(const char *pathname, mode_t mode);

​ mkfifo()函数,用来生成一个先入先出(first insert first out)的特殊文件,又叫有名管道。使用时要包含头文件sys/stat.h。

DESCRIPTION
       mkfifo()  makes  a FIFO special file with name pathname.  mode specifies the FIFO's permissions.  It is modified by the process's umask in the usual way: the permissions
       of the created file are (mode & ~umask).

       A FIFO special file is similar to a pipe, except that it is created in a different way.  Instead of being an anonymous communications channel, a FIFO special file is entered into the filesystem by calling mkfifo().

       Once  you  have created a FIFO special file in this way, any process can open it for reading or writing, in the same way as an ordinary file.  However, it has to be open
       at both ends simultaneously before you can proceed to do any input or output operations on it.  Opening a FIFO for reading normally blocks until some other process opens
       the same FIFO for writing, and vice versa.  See fifo(7) for nonblocking handling of FIFO special files.

​ int mkfifo(const char *pathname, mode_t mode); mkfifo()生成一个名字叫“pathname”的先入先出的特殊文件。mode指定这个文件的权限,一般情况下,它通过进程的掩码被修改:这个创建的文件的权限是(mode & ~umask)。

​ 先入先出的特殊文件类似于管道,此外,它用不同的方式被创建。通过调用mkfifo()将一个先入先出的特殊文件输入到文件系统中,而不是作为一个匿名通讯通道。

​ 一旦你用这种方式创建了有名管道,任何进程都可以打开它进程读写操作,像是一个普通的文件。然而,对其进行任何输入或输出操作之前,它必须在两端同时打开。打开一个fifo读取通常会阻塞,直到一些其它的进程打开同一个fifo进行写入。反之亦然。

RETURN VALUE
       On success mkfifo() and mkfifoat() return 0.  In the case of an error, -1 is returned (in which case, errno is set appropriately).

​ mkfifo()调用,成功返回0,失败返回-1.

7.2 有名管道简单应用

​ 有名管道用于两个非亲缘关系的进程之间通讯,所以,我们需要两个.c文件。我们在进程1中循环读取有名管道的数据,当然一般情况下它是阻塞的。然后在进程2中通过main()函数参数入口往有名管道写入数据。

​ 新建一个文件夹named_pipe,编写程序read_named_pipe.c,在该程序内,创建有名管道“FIFO_0”,然后利用open()打开,open()函数返回一个文件描述符fd,使用read()函数从这个文件描述符fd中读取数据。

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>

int main(void)
{
        int ret = 0;
        char buff[128];
        int fd;

        ret = mkfifo("FIFO_0", 666);

        if(-1 == ret)
        {
                perror("mkfifo.");
        }

        printf("Waitting for the data from named_pipe:\n");

        fd = open("FIFO_0", O_RDWR);

        if(-1 == fd)
        {
                perror("open.");
        }

        while(1)
        {
                memset(buff, '\0', sizeof(buff));

                read(fd, buff, sizeof(buff));

                printf("read_named_pipe's is %s: \n", buff);
                sleep(1);
        }

        return 0;
}

​ 在终端中输入:gcc read_named_pipe.c -o read,指定编译为read文件,后续运行可执行文件输入:./read。

​ 运行结果:

root@ubuntu:/home/sgk/Documents/Linux_Program/named_pipe# ./read
mkfifo.: File exists
Waitting for the data from named_pipe:

​ 打印提示信息后,阻塞式读取有名管道中的数据。如果当前终端权限不够,代码不能执行到这里,需要切换su权限。

​ 新建终端,打开named_pipe文件夹,输入:ls,查看文件,此时可以看到有名管道,名为:FIFO_0。然后新建一个.c文件,命名为write_named_pipe.c。在这个.c里,我们通过main()函数往有名管道写数据,所以我们需要main()函数待参数,如:int main(int argc, char *argv)。代码中,我们利用open()函数打开有名管道,此时,可以以“只写”的方式打开。open()函数返回一个文件描述符。我们将argv[1]的数据通过字符串拷贝函数strcpy()拷贝到缓存buff里,然后通过write()函数写入有名管道,完成通过有名管道发送数据。

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

int main(int argc, char * argv[])
{
        int ret = 0;
        char buff[128];
        int fd;

        fd = open("FIFO_0", O_WRONLY);

        if(-1 == fd)
        {
                perror("open.");
        }

        if(argc == 1)
        {
                printf("Please send somthing to pipe!\n");
                exit(EXIT_FAILURE);
        }

        strcpy(buff, argv[1]);

        write(fd, buff, sizeof(buff));

        return 0;
}

​ 编译:gcc write_named_pipe.c -o write,生成可执行文件write。然后在终端输入:./write 123456789,此时在第一个终端界面,我们收到:read_named_pipe’s is 123456789:

​ 运行结果:

image-20221126133509269

7.3 有名管道总结

​ 有名管道用于非亲缘关系的进程之间通讯,通过创建一种特殊的先入先出文件。用到的库函数是mkfifo(),函数原型为:int mkfifo(const char * pathname, mode_t mode);pathname是有名管道的文件路径名,mode是该有名管道的权限。返回值0:成功;-1:失败。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/149224.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Elasticsearch连续剧之基础篇

目录一、前言二、Elasticsearch数据结构三、安装1.配置最大可创建文件数大小2.由于ES不能以root用户运行&#xff0c;我们需要创建一个非root用户&#xff0c;此处创建一个名为es的用户3.安装es4.启动es服务四、常用操作1.创建没有结构的索引2.创建有结构的索引3.删除索引4.文档…

【迅为iMX6Q】开发板 u-boot 2020.04 RTL8211E 以太网驱动适配

相关参考 【迅为iMX6Q】开发板 u-boot 2015.04 SD卡 启动 【迅为iMX6Q】开发板 u-boot 2020.04 SD卡 启动 【迅为iMX6Q】开发板 u-boot 2022.04 SD卡 启动 开发环境 win10 64位 VMware Workstation Pro 16 ubuntu 22.04 【迅为imx6q】开发板&#xff0c; 2G DDR 目标 …

SAP Webservice 发布外网SAP端代理配置

前言 SAP Webservice接口发布外网的需求不算少见&#xff0c;一般是通过代理形式替换Webservice地址中的域名&#xff0c;但是完整的Webservice接口发布外网还需要以下步骤&#xff08;如果调用方在不做这些配置的情况下可以正常调用&#xff0c;则无需处理。&#xff09; 1. 配…

gravity 安装部署

gravity是由膜拜公司自主研发的不同数据库间数据同步工具。 官方介绍&#xff1a;https://github.com/moiot/gravity/blob/master/README-cn.md Gravity 是一款数据复制组件&#xff0c;提供全量、增量数据同步&#xff0c;以及向消息队列发布数据更新。 DRC 的设计目标是&a…

有电脑就可以干的工作有哪些?试试这些项目

现在几乎人人都有手机&#xff0c;吃饭时候看&#xff0c;睡觉的时候看&#xff0c;上个厕所也在看&#xff0c;有次坐地铁&#xff0c;发现很多上学的初中生、小学生都拿着手机&#xff0c;手机档次还挺高&#xff0c;都是最新的苹果、华为款的手机。反之再看看使用电脑的人又…

Linux——信号知识归纳(上)

一.信号概念&#xff08;一&#xff09;.大致认识信号是操作系统控制进程的一种方式&#xff0c;比如ctrl C、栈溢出程序崩溃、kill -9命令等底层都是操作系统发送信号给进程执行特定操作。因此&#xff0c;所有信号就底层而言都是操作系统发出的。同时&#xff0c;进程接收到信…

Java设计模式中桥接模式是什么/桥接模式有什么用,怎么运用桥接模式

继续整理记录这段时间来的收获&#xff0c;详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用&#xff01; 5.5 桥接模式 5.5.1 定义 将抽象与实现分离&#xff0c;使他们可以独立变化&#xff0c;即用组合关系来代替继承关系实现&#xff0c;从而降低抽象与实现两个可变…

相参雷达(CSDN_0004_20220909)

文章编号&#xff1a;CSDN_0004_20220909 雷达信号处理中的一个基本操作是对样本进行积累&#xff0c;以提高SNR。积累的方式包括相参积累和非相参积累。相参积累是对复数信号&#xff08;既包括幅度又包括相位&#xff09;相加积累&#xff1b;非相参积累是对信号的幅度&#…

【时间复杂度与空间复杂度】衡量算法的标准,这篇文章让大家更深刻的理解时间复杂度和空间复杂度

前言&#xff1a; 大家好&#xff0c;我是良辰丫&#xff0c;今天和大家一起讨论一下时间复杂度与空间复杂度&#xff0c;往往来说&#xff0c;这两者是衡量算法好坏的标准&#xff0c;举个简单的例子&#xff0c;你想吃核桃了&#xff0c;用牙能弄开&#xff0c;用夹子也能弄开…

SAP灵活工作流场景配置及Demo测试

首先确保对应流程模板处于激活状态,并且事件已经激活 1. 在Fiori app 管理工作流中配置流程场景 地址&#xff1a;/sap/bc/ui2/flp?sap-client100&sap-languageZH#Workflow-showList 选择创建的灵活工作流模板&#xff0c;点击添加&#xff0c;开始配置场景 维护基本属性及…

JavaSE学习day2_02, IDEA的使用(重点)

4. idea 4.1 什么是idea&#xff1f; 是Java的集成开发工具&#xff0c;该工具把编写代码&#xff0c;编译&#xff0c;运行&#xff0c;调试等都集中在一起了。目前绝大多数企业编程用的执行环境. 特点&#xff1a; 自动保存、自动编译。 我们在使用的时候主要注重于两步…

SpringCloud微服务!!

目录 1.系统架构的演变 2.微服务简介 1.什么是微服务&#xff1f; 2.实现微服务的技术方案有哪些&#xff1f; 3.什么是SpringCloud? 4.微服务技术点【重点】 4.1服务治理、服务注册、服务发现 4.2 Eureka注册中心 4.2.1 Eureka介绍 4.2.2 Eureka 使用入门 4.2.3 Eureka的…

13_1、Java的IO流之File类的使用

一、File类的理解1、File的对象代表着一个文件或者一个文件目录。2、File类在java.io包下。3、File类中涉及文件或文件目录相关的创建、删除、重命名、修改时间、文件大小等方法&#xff0c;并未涉及到对文件内部的内容的读取、写入等操作&#xff0c;如果需要对文件的内容进行…

2023年玩兔年小游戏《兔兔保卫萝卜战》赢新年祝福「钱兔无量」

PS&#xff1a;粉丝可以免费领源码&#xff0c;私信我或者评论666即可~~~~~~~~ 导读 | 世界杯虽已闭幕&#xff0c;但其带给我们的精彩&#xff0c;仿佛就在昨天&#xff0c;想一想&#xff0c;还是有一种爽劲&#xff0c;不知道大家是否也这样&#xff1f;转眼就到了2023年&a…

Java框架:Mybatis

文章目录一、Mybatis概述1.1概念1.2优点与缺点1.3MyBatis和Hibernate的区别1.4Mybatis的核心对象1.5Mybatis执行流程三、Mybatis的快速使用3.1开发环境3.2 创建一个maven项目3.3添加Maven依赖3.4MySQL创建user表3.5创建数据源database.properties文件3.6编写mybatis-config.xml…

H13-531云计算HCIE V2.0——1~400常错题和知识点总结

1~100 35、FusionStorage Block无法是被配置RAID的磁盘,一定要将RAID信息删除后, Fusionstrage block才能识别到这些磁盘? 错误 61、Ceilometer监控通过在计算节点部署Compute服务 84.&#xff08;多选&#xff09;在配置 FusionSphere OpenStack 时&#xff0c;可以用来实…

商务BD干多了,做一个无情的微信发消息机器人帮我发消息吧

1. 有没有那种做微信的伙伴&#xff0c;每天需要定点定时发消息&#xff1f; 2. 有没有那种做电商商务的朋友&#xff0c;每天需要发消息提醒达人商务们&#xff1f; 3. 有没有那种需要定时定点打卡&#xff0c;需要提醒自己要干啥的兄弟姐妹&#xff1f;** 那么有没有大冤种去…

如何获取电脑软件图标和app图标

如何获取电脑软件图标和app图标大家在写博客或者作图的时候经常会需要找到电脑软件图标或者app图标&#xff0c;如果从网上找有的图标并不清楚&#xff0c;今天给大家分享下&#xff0c;怎么快速的获取电脑软件图标和app图标&#xff0c;得到的图标也比较清楚。电脑软件图标获取…

【操作系统】操作系统的Buffer和Cache

文章目录1.Buffer和Cache的区别2.磁盘和文件写入操作案例3.磁盘和文件读取操作案例4.Cache和Buffer的命中案例1.Buffer和Cache的区别 &#xff08;1&#xff09;什么是Buffer Buffer指Linux内存的 Buffer cache&#xff08;缓冲区&#xff09;。Buffer为了让不同的速度的设备…

【迅为iMX6Q】开发板 Linux 5.15.71 SD卡 启动

开发环境 win10 64位VMware Workstation Pro 16ubuntu 22.04【迅为imx6q】开发板&#xff0c; 2G DDR linux-imx 下载 使用 NXP 官方提供的 linux-imx&#xff0c;代码地址为&#xff1a; https://github.com/nxp-imx/linux-imx 使用 git 下载 linux-imx&#xff0c; git cl…