Linux应用编程---7.有名管道
创始人
2024-05-08 18:26:20
0

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

7.1 mkfifo函数详情

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

image-20221126095257525

图1 mkfifo函数详情
NAMEmkfifo, mkfifoat - make a FIFO special file (a named pipe)SYNOPSIS#include #include int mkfifo(const char *pathname, mode_t mode);

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

DESCRIPTIONmkfifo()  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 permissionsof 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 openat 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 opensthe 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 VALUEOn 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 
#include 
#include 
#include 
#include 
#include 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 
#include 
#include 
#include 
#include 
#include 
#include 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:失败。
在这里插入图片描述

相关内容

热门资讯

美国不提安卓系统华为,迈向自主... 华为与美国:一场关于技术、市场与政策的较量在当今这个数字化的世界里,智能手机已经成为我们生活中不可或...
安卓系统怎么打开ppt,选择文... 你有没有遇到过这种情况:手里拿着安卓手机,突然需要打开一个PPT文件,却怎么也找不到方法?别急,今天...
谷歌退回到安卓系统,探索创新未... 你知道吗?最近科技圈可是炸开了锅,谷歌竟然宣布要退回到安卓系统!这可不是一个简单的决定,背后肯定有着...
安卓系统待机耗电多少,深度解析... 你有没有发现,手机电量总是不经用?尤其是安卓系统,有时候明明没怎么用,电量就“嗖”的一下子就下去了。...
小米主题安卓原生系统,安卓原生... 亲爱的手机控们,你是否曾为手机界面单调乏味而烦恼?想要给手机换换“衣服”,让它焕然一新?那就得聊聊小...
voyov1安卓系统,探索创新... 你有没有发现,最近你的手机是不是变得越来越流畅了?没错,我要说的就是那个让手机焕发青春的Vivo V...
电脑刷安卓tv系统,轻松打造智... 你有没有想过,家里的安卓电视突然变得卡顿,反应迟钝,是不是时候给它来个“大保健”了?没错,今天就要来...
安卓系统即将要收费,未来手机应... 你知道吗?最近有个大消息在科技圈里炸开了锅,那就是安卓系统可能要开始收费了!这可不是开玩笑的,这可是...
雷凌车载安卓系统,智能出行新体... 你有没有发现,现在的汽车越来越智能了?这不,我最近就体验了一把雷凌车载安卓系统的魅力。它就像一个聪明...
怎样拍照好看安卓系统,轻松拍出... 拍照好看,安卓系统也能轻松搞定!在这个看脸的时代,拍照已经成为每个人生活中不可或缺的一部分。无论是记...
安卓车机系统音频,安卓车机系统... 你有没有发现,现在越来越多的汽车都开始搭载智能车机系统了?这不,咱们就来聊聊安卓车机系统在音频方面的...
老苹果手机安卓系统,兼容与创新... 你手里那台老苹果手机,是不是已经陪你走过了不少风风雨雨?现在,它竟然还能装上安卓系统?这可不是天方夜...
安卓系统7.dns,优化网络连... 你有没有发现,你的安卓手机最近是不是有点儿“慢吞吞”的?别急,别急,让我来给你揭秘这可能与你的安卓系...
安卓手机系统怎么加速,安卓手机... 你有没有发现,你的安卓手机最近变得有点“慢吞吞”的?别急,别急,今天就来给你支几招,让你的安卓手机瞬...
小米note安卓7系统,探索性... 你有没有发现,手机更新换代的速度简直就像坐上了火箭呢?这不,小米Note这款手机,自从升级到了安卓7...
安卓和鸿蒙系统游戏,两大系统游... 你有没有发现,最近手机游戏界可是热闹非凡呢!安卓和鸿蒙系统两大巨头在游戏领域展开了一场激烈的较量。今...
安卓手机没有系统更,揭秘潜在风... 你有没有发现,现在安卓手机的品牌和型号真是五花八门,让人挑花了眼。不过,你知道吗?尽管市面上安卓手机...
充值宝带安卓系统,安卓系统下的... 你有没有发现,最近手机上的一款充值宝APP,在安卓系统上可是火得一塌糊涂呢!这不,今天就来给你好好扒...
安卓系统8.0镜像下载,轻松打... 你有没有想过,想要给你的安卓手机升级到最新的系统,却不知道从哪里下载那个神秘的安卓系统8.0镜像呢?...
安卓系统修改大全,全方位修改大... 你有没有想过,你的安卓手机其实是个大宝藏,里面藏着无数可以让你手机焕然一新的秘密?没错,今天就要来个...