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

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

进程间的通信

进程间通信(IPC,Interprocess Communication)是指在不同进程之间传输数据和交换信息的一种机制。它允许多个进程在同一操作系统中同时运行,并实现彼此之间的协作

进程间通信方式:

  1. 管道(Pipe)管道是最基本的进程间通信方式,它是一种半双工的通信方式,通过管道,可以实现两个不同进程之间的通信,使用时,只能一方写入,另一方读出。

  2. 消息队列(Message Queue):消息队列可以在没有任何关系的进程之间传递数据,它提供了一个消息的队列,发送方将消息放入队列,接收方从队列中获取消息。这种通信方式允许发送方和接收方独立于对方,不需要同步操作

  3. 共享内存(Shared Memory)共享内存是最快的进程间通信方式,它将一个特定的内存区域映射到多个进程的地址空间中,使得这些进程可以直接访问这块共享内存。共享内存通信方式适合于大量数据的高速交换

  4. 信号量(Semaphore):信号量是一种计数器,用于进程间的同步和互斥操作。它可以用来保护临界区资源,控制并发访问和协调进程间的操作顺序。

  5. 套接字(Socket):套接字是一种网络编程中常用的通信方式,它可以在不同主机之间进行进程间通信。套接字通信方式适用于分布式系统或者网络环境下的进程间通信。

  6. 管理器对象(Manager Object):这种通信方式利用一个专门的进程作为服务器,其他进程通过请求服务器来实现通信。管理器对象可以提供共享数据、远程过程调用等功能。

  7. 文件和数据库:进程可以通过读取和写入文件、数据库的方式进行通信。这种通信方式适用于持久化数据的交换和共享。

匿名管道

匿名管道,顾名思义也就是没有名字的管道,这种管道用于具有血缘关系的进程(父子进程等)之间进行通信。它是一种单向通信方式(半双工),即数据只能从一个进程流向另一个进程;

下面来了解匿名管道是如何创建的?
Linux--进程间的通信-匿名管道,Linux,linux,数据库,运维

Linux--进程间的通信-匿名管道,Linux,linux,数据库,运维
Linux--进程间的通信-匿名管道,Linux,linux,数据库,运维

代码验证

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

void writer(int wfd)
{
    const char* str="hello father,i am child";
    char buffer[128];
    int cnt=0;
    pid_t pid=getpid();
    while(1)
    {
        snprintf(buffer,sizeof(buffer),"message: %s, pid: %d,count:%d\n",str,pid,cnt);
        write(wfd,buffer,sizeof(buffer)-1);
        cnt++;
        sleep(1);
    }
}
void reader(int rfd)
{
    char buffer[1024];
    while(1)
    {
        ssize_t n=read(rfd,buffer,sizeof(buffer)-1);
        printf("father get a message: %s",buffer);
    }
}
int main()
{
    int pipefd[2];
    int n=pipe(pipefd);
    if(n<0) return 1;
    printf("pipefd[0]:%d,pipefd[1]:%d\n",pipefd[0],pipefd[1]);

    pid_t id=fork();
    if(id==0)
    {
        close(pipefd[0]);

        writer(pipefd[1]);

        exit(0);
    }

    close(pipefd[1]);

    reader(pipefd[0]);
    wait(NULL);

    return 0;
}

Linux--进程间的通信-匿名管道,Linux,linux,数据库,运维
Linux--进程间的通信-匿名管道,Linux,linux,数据库,运维
Linux--进程间的通信-匿名管道,Linux,linux,数据库,运维

对匿名管道的具体分析

Linux--进程间的通信-匿名管道,Linux,linux,数据库,运维
Linux--进程间的通信-匿名管道,Linux,linux,数据库,运维
Linux--进程间的通信-匿名管道,Linux,linux,数据库,运维
Linux--进程间的通信-匿名管道,Linux,linux,数据库,运维
Linux--进程间的通信-匿名管道,Linux,linux,数据库,运维
Linux--进程间的通信-匿名管道,Linux,linux,数据库,运维

匿名管道的特点

  • 1.匿名管道只能用于具有情缘关系(父子进程)的进程间通信;
  • 2.自带同步机制
  • 3.管道只能单向通信,属于半双工通信类型;
  • 4.只要连接的进程有一方退出,那么管道自动释放,文件的生命周期是伴随着进程的;

PIPE_BUF

PIPE_BUF是一个宏定义,在Linux系统中,它表示管道(pipe)的缓冲区大小(一般为4096字节)。具体来说,PIPE_BUF定义了一个原子写入管道的最大字节数。

根据POSIX标准规定,当要写入的数据长度小于等于PIPE_BUF时,操作系统会保证写入的原子性。也就是说,对于不超过PIPE_BUF字节的写操作,写入的数据会作为一个连续序列写入管道,而不会被其他进程的写操作所中断

然而,当要写入的数据长度超过PIPE_BUF时,操作系统并不保证写入的原子性。这意味着,写入的数据可能会被其他进程的写操作所中断,从而导致数据交叉写入到管道中

需要注意的是,PIPE_BUF的值可以在不同的系统上有所不同。在大多数系统中,PIPE_BUF的值通常为4096字节(4KB),但也可以更大或更小。你可以通过在代码中包含头文件limits.h并查看其中的定义来获取当前系统上的PIPE_BUF值。

所以,在使用管道进行进程间通信的时候,如果希望保证数据的完整性,应确保每次写入的数据不超过PIPE_BUF字节。如果要写入的数据量超过了PIPE_BUF,可以考虑分多次写入或使用其他方式来保证数据的完整性文章来源地址https://www.toymoban.com/news/detail-850802.html

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

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

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

相关文章

  • 【Linux】进程间通信(匿名管道 & 命名管道)-- 详解

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    2024年02月16日
    浏览(30)
  • 【Linux之进程间通信】04.Linux进程间的信号通信

      【Linux之进程间通信】 项目代码获取: https://gitee.com/chenshao777/linux-processes.git (麻烦点个免费的Star哦,您的Star就是我的写作动力!) 04.Linux进程间的信号通信 【目录】   一、进程间信号发送方式   二、进程间信号接收方式   三、进程间信号处理方式 一、进程间信号发

    2024年02月06日
    浏览(31)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包