Linux——进程间通信&&管道

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

Linux——进程间通信&&管道,Linux操作系统,linux,java,数据库

📘北尘_:个人主页

🌎个人专栏:《Linux操作系统》《经典算法试题 》《C++》 《数据结构与算法》

☀️走在路上,不忘来时的初心

一、进程间通信

1、进程间通信的目的

  1. 数据传输:一个进程需要把他的数据传给另外一个进程。
  2. 资源共享:多个进程之间共享同样的资源。
  3. 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。

2、进程间通信发展

  1. 管道(本质上就是文件)
  2. System V进程间通信
  3. POSIX进程间通信

3、进程间通信分类

管道

  1. 匿名管道pipe
  2. 命名管道

System V IPC

  1. System V 消息队列
  2. System V 共享内存
  3. System V 信号量

POSIX IPC

  1. 消息列队
  2. 共享内存
  3. 信号量
  4. 互斥量
  5. 条件变量
  6. 读写锁

二、管道

1、什么是管道?

管道是Unix中最古老的进程间通信的形式。
我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”
Linux——进程间通信&&管道,Linux操作系统,linux,java,数据库

2、用fork来共享管道原理

Linux——进程间通信&&管道,Linux操作系统,linux,java,数据库

3、站在文件描述符角度-深度理解管道

Linux——进程间通信&&管道,Linux操作系统,linux,java,数据库
Linux——进程间通信&&管道,Linux操作系统,linux,java,数据库文章来源地址https://www.toymoban.com/news/detail-845215.html

4、管道的五个特点

  1. 具有血缘关系才可以进程间通信。
  2. 管道只能进程单向通信。
  3. 父子协同 同步和互斥。
  4. 面向字节流。
  5. 管道是基于文件的,而文件的声明周期是随进程的。

5、管道的四种场景

  1. 读写端正常,如果管道为空,写端会堵塞
  2. 读写端正常,如果管道已满,读端会堵塞
  3. 读端正常读,写端关闭,读端就会读到0,表示读到文件结尾,不会堵塞
  4. 写端正常读,读端关闭,则write操作会产生信号SIGPIPE,进而可能导致write进程退出。

6、代码示例

#include<iostream>
#include<sys/types.h>
#include<cstdio>
#include<unistd.h>
#include<sys/wait.h>
#include<string>
#include<cstring>
using namespace std;
#define NUM 1024
#define N 2

void Writer(int fd)
{
    char buffer[NUM];
    string s="hello l am child";
    pid_t id=getpid();
    int number=0;
    
    while(1)
    {
        sleep(1);
        buffer[0]=0;
        snprintf(buffer,sizeof(buffer),"%s-%d-%d",s.c_str(),id,number++);
        write(fd,buffer,strlen(buffer));
    }
}
void Reader(int id)
{
    char buffer[NUM];
    while(1)
    {
        buffer[0]=0;
        ssize_t n=read(id,buffer,sizeof(buffer));
        if(n>0)
        {
            buffer[n]='\0';
            cout<<buffer<<endl;
        }
    }
}
int main()
{
    int pipefd[N]={0};
    int n=pipe(pipefd);
    if(n<0) return 1;
    pid_t id=fork();
    if(id<0) return 2;
    if(id==0)
    {
        //子进程
        close(pipefd[0]);
        Writer(pipefd[1]);
        exit(0);
    }
    //父进程
    close(pipefd[1]);
    Reader(pipefd[0]);
    pid_t rid=waitpid(id,nullptr,0);
    return 0;
}

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

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

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

相关文章

  • 【Linux】操作系统&&进程概念

    冯·诺依曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构 。数学家冯·诺依曼提出了计算机制造的三个基本原则,即采用二进制逻辑、程序存储执行以及计算机由五个部分组成( 运算器、控制器、存储器、输入设备、输出设备 ),这

    2024年01月16日
    浏览(48)
  • Linux操作系统篇:进程

    我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系 为什么计算机要采用冯诺依曼体系呢? 在计算机出现之前有很多人都提出过计算机体系结构,但最终选择冯诺依曼是因为用比较少的钱就可以做出效率不错的计算机 截至目前,我们

    2024年03月18日
    浏览(47)
  • Linux--操作系统进程的状态

    【Linux】进程概念 —— 进程状态_linux d状态进程_Hello_World_213的博客-CSDN博客 新建: 字面意思,将你的task_struct创建出来并且还未入队列 运行: task_struct结构体在运行队列中排队,就叫做运行态 阻塞: 等待非CPU资源就绪,阻塞状态   挂起: 当内存不足的时候,OS通过适当的

    2024年02月15日
    浏览(52)
  • 【Linux】进程通信之匿名管道通信

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

    2024年04月14日
    浏览(46)
  • 【Linux】进程通信之管道通信详解

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

    2023年04月19日
    浏览(41)
  • Linux——进程间通信(管道)

    目录 进程通信的目的 管道 见见猪跑(举个例子) 文件描述符fd与管道的关系(深度理解管道) 什么是管道?  匿名管道 pipe函数概述 父子进程通信时与文件描述符的关系图(理解pipe函数的关键) pipe函数的使用  管道读写规则 管道的大小 自测  使用man 7 pipe查看 使用ulimit -a查看 管

    2024年02月03日
    浏览(88)
  • Linux——进程间通信&&管道

    📘北尘_ :个人主页 🌎个人专栏 :《Linux操作系统》《经典算法试题 》《C++》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 数据传输:一个进程需要把他的数据传给另外一个进程。 资源共享:多个进程之间共享同样的资源。 通知事件:一个进程需要向另一个或一组

    2024年04月09日
    浏览(43)
  • Linux——进程间通信、管道

    进程间的通信就是 在不同进程之间传播或交换信息。 举个例子: 古时,两军交战不斩来使; 因为两军互相是独立的,所以使节就是两军之间传话的进行传话的; 而在OS中,进程之间也是相互独立的,但某项工作并不是一个进程就可以完成,而是多个进程之间相互协助完成;

    2024年02月22日
    浏览(42)
  • Linux进程通信:无名管道

    (1)数据传输:进程间数据传输; (2)通知事件:一个进程向另一个或一组进程发送消息,通知某个事件的发生(如子进程终止时需通知父进程); (3)资源共享:多个进程共享资源,需要内核提供同步互斥机制; (4)进程控制:某进程需要控制另一个进程的执行(如

    2023年04月24日
    浏览(54)
  • [Linux]进程间通信--管道

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

    2024年02月09日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包