【Linux】进程通信之匿名管道通信

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

一、进程间进行通信的目的

我们往往需要多个进程协同,共同完成一些事情。

  • 数据传输:一个进程需要将它的数据发送给另一个进程
  • 资源共享:多个进程之间共享同样的资源。
  • 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止 时要通知父进程)。
  • 进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另 一个进程的所有陷入和异常,并能够及时知道它的状态改变

        进程间通信的本质:要让不同的进程看到同一份资源,这份资源一般是由操作系统提供的。操作系统提供的资源不同,就决定了有不同的通信方式

二、管道通信

2.1、匿名管道通信的原理

        基于文件的方式,让不同进程看到同一份资源的通信方式,叫做管道,管道通信只能为单向通信如果今天我们让父进程以读和写两种方式打开同一个文件,操作系统是会为我们创建两个struct file结构体的,只不过这两个struct file结构体的缓冲区是同一个。如果我们让这个父进程创建一个子进程,子进程的PCB和文件描述符表和父进程一模一样,所以此时子进程也是以读和写两种方式打开了父进程打开的这个文件。这样操作就让父子进程看到了同一份资源。也就是说struct file对象是允许多个进程通过指针指向它的

【Linux】进程通信之匿名管道通信,服务器,linux,c语言,后端,信息与通信

        前面也说过,管道通信为单向通信,所以如果想让父进程写子进程读,就关闭父进程的读端关闭子进程的写端,反之亦然。

2.2、pipe系统调用函数

        pipe可以帮我们创建一个不需要向磁盘刷新且磁盘中并不存在的文件,也就是管道。这是一个内存级的文件,是匿名文件或叫匿名管道。匿名管道只能让具有血缘关系的进程进行进程通信,常用于父子进程之间进行进程通信

【Linux】进程通信之匿名管道通信,服务器,linux,c语言,后端,信息与通信

2.3、匿名管道通信的简单实现

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



void writer(int wfd)
{
    char buffer[128];
    int count = 0;
    while (1)
    {
        snprintf(buffer, sizeof(buffer), "I am your child!, pid:%d, count:%d\n", getpid(), count++);
        write(wfd, buffer, strlen(buffer));
        sleep(1);
    }
    
   
}

void reader(int rfd)
{
    char buffer[128];
   while (1)
   {
        read(rfd, buffer, sizeof(buffer));
        printf("father get message:%s", buffer);
   }
   
}

int main()
{
    int pipefd[2];
    int n = pipe(pipefd);

    int fd = fork();
    if(fd == 0)
    {
        //子进程充当写端,从而关闭读端
        close(pipefd[0]);
        writer(pipefd[1]);
        exit(0);
    }

    //父进程充当读端,从而关闭写端
    close(pipefd[1]);
    reader(pipefd[0]);
    wait(NULL);
    return 0;
}

父进程不断读到从子进程发来的消息: 

【Linux】进程通信之匿名管道通信,服务器,linux,c语言,后端,信息与通信文章来源地址https://www.toymoban.com/news/detail-851151.html

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

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

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

相关文章

  • Linux--进程间的通信-匿名管道

    进程间通信(IPC,Interprocess Communication)是指在不同进程之间传输数据和交换信息的一种机制。它允许多个进程在同一操作系统中同时运行,并实现彼此之间的协作 。 进程间通信方式: 管道(Pipe) : 管道是最基本的进程间通信方式 ,它是一种 半双工 的通信方式,通过管

    2024年04月14日
    浏览(39)
  • [Linux]进程间通信(上篇)——匿名管道(管道原理,实现示例,端口情况探究!!)

            hello,大家好,本篇文章介绍Linux进程间的通信,包含内容有进程间通信的介绍、理解,管道的介绍使用:匿名管道,匿名管道的实现示例,匿名管道端口4种情况的探究。    目录  1️⃣进程间通信  🍙进程间通信目的 🍙进程间通信分类 🍙进程间通信的技术背景

    2024年02月14日
    浏览(44)
  • Linux通信--构建进程通信的 方案之管道(下)|使用匿名管道实现功能解耦|命名管道实现serve&client通信

    文章目录 一、管道的应用实例-父进程唤醒子进程,子进程执行某种任务 二、命名管道 1.创建一个命名管道 2.匿名管道与命名管道的区别 3.命名管道的打开规则 4.用命名管道实现serverclient通信 后续将源码上传到gitee,上传后修改链接。 管道应用的一个限制就是只能具有共同祖

    2024年02月10日
    浏览(39)
  • 【看表情包学Linux】IPC 进程间通信 | PIPE 管道 | 匿名管道 | 管道通信的原理 | 系统调用: pipe 接口

       🤣  爆笑 教程  👉 《看表情包学Linux》 🔥 CSDN 累计订阅量破千的火爆 C/C++ 教程的 2023 重制版,C 语言入门到实践的精品级趣味教程。 了解更多: 👉  \\\"不太正经\\\" 的专栏介绍  ← 试读第一章 订阅链接: 🔗 《C语言趣味教程》 ← 猛戳订阅! 目录 Ⅰ. 进程间通信(I

    2024年02月14日
    浏览(33)
  • 【探索Linux】—— 强大的命令行工具 P.14(进程间通信 | 匿名管道 | |进程池 | pipe() 函数 | mkfifo() 函数)

    当今计算机系统中,进程间通信扮演着至关重要的角色。随着计算机系统的发展和复杂性的增加,多个进程之间的协作变得更加必要和常见。进程间通信使得不同进程能够共享资源、协调工作、传输数据,并实现更加复杂和强大的功能。本文将深入探讨进程间的通信,以及管

    2024年02月05日
    浏览(68)
  • 【Linux】匿名管道实现简单进程池

    管道内部没有数据且子进程不关闭自己的写端文件fd,读端(父进程)就要阻塞等待,直到管道里有数据。 管道内部被写满了且父进程(读端)不关闭自己的读端fd,写端(子进程)写满以后就要阻塞等待。 对于写端而言,如果写端不写了且关闭了写端fd,读端就会将管道中

    2024年04月22日
    浏览(30)
  • 【Linux从入门到精通】通信 | 管道通信(匿名管道 & 命名管道)

        本派你文章主要是对进程通信进行详解。主要内容是介绍 为什么通信、怎么进行通信。其中本篇文章主要讲解的是管道通信。希望本篇文章会对你有所帮助。 文章目录 一、进程通信简单介绍 1、1 什么是进程通信 1、2 为什么要进行通信  1、3 进程通信的方式 二、匿名管

    2024年02月09日
    浏览(39)
  • 【Linux】匿名管道与命名管道,进程池的简易实现

    本质是先让不同的进程看到同一份资源,也就是两个进程都能对管道文件的缓冲区进行操作 这里我们pipe的时候,会使用两个文件描述符,这两个文件描述里面存的file结构体是同一个,也就是管道文件的file结构体,file结构体中存储有inode以及系统缓冲区,此时fork一个子进程

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

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

    2024年02月16日
    浏览(37)
  • 【Linux后端服务器开发】管道设计

    目录 一、管道通信 二、匿名管道 1. 匿名管道通信 2. 匿名管道设计 三、命名管道 comm.hpp client.cc serve.cc 进程通信 数据传输:一个进程需要将它的数据发送给另一个进程 资源共享:多个进程之间共享同样的资源 通知事件:一个进程向另一个(一组)进程发送信息,通知它们发

    2024年02月13日
    浏览(52)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包