多进程间通信学习之有名管道

这篇具有很好参考价值的文章主要介绍了多进程间通信学习之有名管道。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • 有名管道:
  • 区别于无名管道,其可以用于任意进程间的通信
  • 同无名管道一样,也是半双工的通信方式
  • 有名管道的大小也是64KB
  • 也是不能使用lseek函数
  • 其本质上,是在内存上,在文件系统上只是一个标识
  • 有名管道会创建一个管道文件,只需要打开这个文件,进行相应的读写操作即可;
  • 读写特点:
  • 若读端存在写管道,那么有多少数据,就写多少数据,直到有名管道写满为止,此时会出现写阻塞
  • 若读端不存在写管道,会出现两种情况
  • 第一种:读端没有打开,写端open函数的位置阻塞;
  • 第二种:读端打开后关闭,会出现管道破裂的现象;
  • 若写端存在读管道,那么有多少数据,就读多少数据,没有数据的时候,会出现阻塞等待
  • 若写端不存在读管道,也会出现两种情况
  • 第一种:写端没有打开,读端open函数的位置阻塞;
  • 第二种:写端打开后关闭,有多少数据,就读多少,没有数据的时候,就会立即返回,即非阻塞的状态
  • 创建有名管道(mkfifo函数):
	#include <sys/types.h>
	#include <sys/stat.h>
	
	int mkfifo(const char *pathname, mode_t mode);
	/*
	功能:
	
			创建管道文件
	
	参数:
	
	    	pathname:管道路径和名字
	
	    	mode:管道文件的权限
	
	返回值:
	
	    	成功 0
	
	    	失败 -1 重置错误码
	*/
  • 示例代码:
  • 写端:
	#include <stdio.h>
	#include <string.h>
	#include <stdlib.h>
	
	#include <unistd.h>
	#include <sys/types.h>
	#include <sys/stat.h>
	#include <fcntl.h>
	
	#include <sys/wait.h>
	#include <stdbool.h>
	
	int main(int argc, char const *argv[])
	{
	    int fd = open("./fifo_k",O_WRONLY);
	    if(-1 == fd)
	    {
	        perror("open error");
	        exit(-1);
	    }
	    char buf[128] = {0};
	    while(true)
	    {
	        memset(buf,0,sizeof(buf));
	        fgets(buf,sizeof(buf),stdin);
	        buf[strlen(buf) - 1] = '\0';
	        write(fd,buf,sizeof(buf));
	        if(!strncmp(buf,"quit",4))
	        {
	            exit(-1);
	
	        }
	    }
	    close(fd);
	    
	    return 0;
	}


  • 读端:
	#include <stdio.h>
	#include <string.h>
	#include <stdlib.h>
	
	#include <unistd.h>
	#include <sys/types.h>
	#include <sys/stat.h>
	#include <fcntl.h>
	
	#include <sys/wait.h>
	#include <stdbool.h>
	
	int main(int argc, char const *argv[])
	{
	    int fd = open("./fifo_k",O_RDONLY);
	    if(-1 == fd)
	    {
	        perror("open error");
	        exit(-1);
	    }
	    char buf[128] = {0};
	    while(true)
	    {
	        memset(buf,0,sizeof(buf));
	        read(fd,buf,sizeof(buf));
	        if(!strncmp(buf,"quit",4))
	        {
	            exit(-1);
	
	        }
	        printf("写端发来的数据[%s]\n",buf);
	    }
	    close(fd);
	    
	    return 0;
	}
	

  • 运行结果:
  • 写端:
	hello
	china
	quit
  • 读端:
	写端发来的数据[hello]
	写端发来的数据[china]

文章来源地址https://www.toymoban.com/news/detail-734143.html

到了这里,关于多进程间通信学习之有名管道的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux】进程间通信——进程间通信的介绍和分类、管道、匿名管道、命名管道、匿名管道与命名管道的区别

      进程间通信(IPC,Interprocess communication)是一组编程接口,让程序员能够协调不同的进程,使之能在一个操作系统里同时运行,并相互传递、交换信息。这使得一个程序能够在同一时间里处理许多用户的要求。因为即使只有一个用户发出要求,也可能导致一个操作系统中

    2024年02月05日
    浏览(40)
  • 管道-有名管道

    一、有名管道  有名管道与匿名管道的不同: 有名管道提供了一个路径名,并以FIFO的文件形式存在于文件系统中。 与匿名管道不同,有名管道可以被不相关的进程使用,只要它们可以访问该路径,就能够通过有名管道进行通信。 FIFO的打开和使用方式: 一旦打开了有名管道

    2024年02月07日
    浏览(25)
  • 【Linux】进程通信之管道通信详解

    🍎 作者: 阿润菜菜 📖 专栏: Linux系统编程 其实管道通信是Unix中最古老的进程间通信的形式了: 管道通信是一种进程间通信的方式,它可以让一个进程的输出作为另一个进程的输入,实现数据的传输、资源的共享、事件的通知和进程的控制。 管道通信分为两种类型:匿名

    2023年04月19日
    浏览(30)
  • 【Linux】进程通信之匿名管道通信

    我们往往需要多个进程协同,共同完成一些事情。 数据传输:一个进程需要将它的数据发送给另一个进程 资源共享:多个进程之间共享同样的资源。 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止 时要通知父进程)。

    2024年04月14日
    浏览(36)
  • 【Linux】进程间通信(匿名管道 & 命名管道)-- 详解

    如何理解进程间通信? 进程具有独立性,所以进程想要通信难度是比较大的,成本高。 在日常生活中,通信的本质是传递信息,但站在程序员角度来看, 进程间通信的本质:让不同的进程看到同一份资源(内存空间) 。 进程间通信就是进程之间互相传递数据,那么进程间

    2024年04月28日
    浏览(37)
  • 进程间通信之利用命名管道进行通信

    命名管道(Named Pipe),也被称为FIFO(First In, First Out),是一种在Unix和Unix-like操作系统中用于进程间通信的特殊文件类型。它允许不相关的进程通过文件系统中的路径名进行通信。 命名管道(Named Pipe)是一种在Unix和Unix-like系统中用于进程间通信的特殊文件类型。它的作用主

    2024年01月19日
    浏览(25)
  • 进程间通信(命名管道)

    目录:            1.命名管道            2.创建命名管道 --------------------------------------------------------------------------------------------------------------------------------- 1.命名管道 1.管道的一个应用限制就是只能在具有共同祖先(具有亲缘关系)的进程间通信 2.如果我们想在不相

    2024年02月06日
    浏览(27)
  • 进程间通信-命名管道

            先前已经了解了匿名管道,但是这是适用于有血缘关系的进程间,如果无血缘关系的进程要实现通信, 此时需要有另一种通信方案-命名管道。为什么命名管道可以用于无血缘关系的进程间通信,什么是命名管道,为什么说它是有名字的,后面我们会一一了解。

    2024年01月20日
    浏览(26)
  • 【Linux】进程通信 — 管道

    从本章开始,我们开始学习进程通信相关的知识,本章将来详细探讨一下管道,学习匿名管道和命名管道的原理和代码实现等相关操作。目标已经确定,接下来就要搬好小板凳,准备开讲了…🙆🙆🙆🙆 在我们之前的学习中,我们知道进程是具独立性的。但是不要以为进程

    2024年02月16日
    浏览(33)
  • 进程间通信之匿名管道

    1.进程间为什么要进行通信? 进程间通信的是为了协调不同的进程,使之能在一个操作系统里同时运行,并相互传递、交换信息。 2.进程间通信的目的包括: 数据传输:一个进程需要将它的数据发送给另一个进程; 资源共享:多个进程间共享同样的资源; 通知事件:一个进程

    2024年02月16日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包