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:失败。
在这里插入图片描述

相关内容

热门资讯

安卓子系统windows11,... 你知道吗?最近科技圈可是炸开了锅,因为安卓子系统在Windows 11上的兼容性成了大家热议的话题。...
电脑里怎么下载安卓系统,电脑端... 你有没有想过,你的电脑里也能装上安卓系统呢?没错,就是那个让你手机不离手的安卓!今天,就让我来带你一...
索尼相机魔改安卓系统,魔改系统... 你知道吗?最近在摄影圈里掀起了一股热潮,那就是索尼相机魔改安卓系统。这可不是一般的改装,而是让这些专...
安卓系统哪家的最流畅,安卓系统... 你有没有想过,为什么你的手机有时候像蜗牛一样慢吞吞的,而别人的手机却能像风一样快?这背后,其实就是安...
安卓最新系统4.42,深度解析... 你有没有发现,你的安卓手机最近是不是有点儿不一样了?没错,就是那个一直在默默更新的安卓最新系统4.4...
android和安卓什么系统最... 你有没有想过,你的安卓手机到底是用的是什么系统呢?是不是有时候觉得手机卡顿,运行缓慢,其实跟这个系统...
平板装安卓xp系统好,探索复古... 你有没有想过,把安卓系统装到平板上,再配上XP系统,这会是怎样一番景象呢?想象一边享受着安卓的便捷,...
投影仪装安卓系统,开启智能投影... 你有没有想过,家里的老式投影仪也能焕发第二春呢?没错,就是那个曾经陪你熬夜看电影的“老伙计”,现在它...
安卓系统无线车载carplay... 你有没有想过,开车的时候也能享受到苹果设备的便利呢?没错,就是那个让你在日常生活中离不开的iOS系统...
谷歌安卓8系统包,系统包解析与... 你有没有发现,手机更新换代的速度简直就像坐上了火箭呢?这不,最近谷歌又发布了安卓8系统包,听说这个新...
微软平板下软件安卓系统,开启全... 你有没有想过,在微软平板上也能畅享安卓系统的乐趣呢?没错,这就是今天我要跟你分享的神奇故事。想象你手...
coloros是基于安卓系统吗... 你有没有想过,手机里的那个色彩斑斓的界面,背后其实有着一个有趣的故事呢?没错,我要说的就是Color...
安卓神盾系统应用市场,一站式智... 你有没有发现,手机里的安卓神盾系统应用市场最近可是火得一塌糊涂啊!这不,我就来给你好好扒一扒,看看这...
黑莓平板安卓系统升级,解锁无限... 亲爱的读者们,你是否还记得那个曾经风靡一时的黑莓手机?那个标志性的全键盘,那个独特的黑莓体验,如今它...
安卓文件系统采用华为,探索高效... 你知道吗?最近安卓系统在文件管理上可是有了大动作呢!华为这个科技巨头,竟然悄悄地给安卓文件系统来了个...
深度系统能用安卓app,探索智... 你知道吗?现在科技的发展真是让人惊叹不已!今天,我要给你揭秘一个超级酷炫的话题——深度系统能用安卓a...
安卓系统的分区类型,深度解析存... 你有没有发现,你的安卓手机里藏着不少秘密?没错,就是那些神秘的分区类型。今天,就让我带你一探究竟,揭...
安卓系统铠无法兑换,揭秘无法兑... 最近是不是有很多小伙伴在玩安卓系统的游戏,突然发现了一个让人头疼的问题——铠无法兑换!别急,今天就来...
汽车安卓系统崩溃怎么刷,一键刷... 亲爱的车主朋友们,你是否曾遇到过汽车安卓系统崩溃的尴尬时刻?手机系统崩溃还能重启,但汽车系统崩溃了,...
miui系统可以刷安卓p系统吗... 亲爱的手机控们,你是否对MIUI系统情有独钟,同时又对安卓P系统的新鲜功能垂涎欲滴?今天,就让我带你...