Linux进程间通信学习记录(无名管道)

news2024/9/24 1:27:30

0.Linux进程间通信的方式

(1).从UNIX继承过来的通信方式

                无名管道(pipe)

                有名管道(fifo)

                信号(signal)

(2).System V IPC

                共享内存

                消息队列

                信号灯集

(3).套接字

一.无名管道介绍

1.特点

        ①.无名管道只能用于有亲缘关系的进程之前的通信(父子进程、兄弟进程等)

        ②.单工的通信模式,数据流是单方向的。有固定的读端写端

        ③.无名管道创建时会返回两个文件描述符,分别用于读和写。即读写的文件描述符是分开

        ④.管道中的内容被读走后,就相当于流出去了,之后管道中就没有数据了。

        ⑤.若要实现双工通信,则可以创建两个数据流方向相反的无名管道。

2.读无名管道

(1).写端存在时

        ①.管道内有数据时,读端调用read()函数,返回值是实际读到的字节数。

        ②.管道内没有数据时,读端调用read()会阻塞等待,直到管道内有数据。

(3).写端不存在时

       ①.管道内有数据时,读端调用read()函数,返回值是实际读到的字节数。

        ②.管道内没有数据时,读端调用read()函数,会立刻返回0。

3.写无名管道

(1).读端存在(有进程可以读管道)

                ①.有空间时,write()返回实际写入的字节数。

                ②.空间不足时,假设管道内剩余128个字节空间可以写入,但是write()里面要写256             个字节,进程会先写入128个字节,等到(写操作进行阻塞)管道有空间了再继续写入。

(2).读端不存在(没有进程可以读管道)

                ①.管道会断裂,即写管道的进程会被信号结束。

二.无名管道C函数

1.无名管道的创建 - pipe

功能

        创建一个无名管道;

        成功时返回(0),失败返回(EOF)

参数

        pfd[2]:用来保存无名管道的读端和写端的文件描述符

                pfd[0]:用于管道

                pfd[1]:   用于管道

int pipe(int pfd[2]);

三.无名管道代码示例

功能

        子进程1和子进程2分别向管道中写入数据;父进程读去管道数据

1.流程图

2.代码

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



int main(void)
{
    pid_t pid1,pid2;        //用于创建两个子进程
    int pfd[2];             //读管道和写管道的文件描述符
    char buf[32];           //缓冲区

    /* 1.创建无名管道 */
    if(0 > pipe(pfd))
    {
        perror("pipe error");
        exit(-1);
    }

    /* 2.创建子进程1 */
    pid1 = fork();
    switch(pid1)
    {
        case -1:
            printf("fork pid1 error\n");
            exit(-1);
            break;
        /* 子进程1  */
        case 0:
            strcpy(buf,"this is process1");
            write(pfd[1],buf,32);
            exit(0);
            break;
        /* 父进程 */
        default:
            /* 3.创建子进程2 */
            pid2 = fork();
            switch(pid2)
            {
                case -1:
                    printf("fork pid2 error\n");
                    exit(-1);
                    break;

                /* 子进程2  */
                case 0:
                    sleep(1);       //让子进程1先完成操作
                    strcpy(buf,"this is process2");
                    write(pfd[1],buf,32);
                    break;
                /* 父进程 */
                default:
                    /* 4.阻塞等待回收子进程 */
                    wait(NULL);

                    /* 5.读管道 */
                    read(pfd[0],buf,32);
                    printf("%s\n",buf);

                    wait(NULL);
                    read(pfd[0],buf,32);
                    printf("%s\n",buf);
                    break;
            }
            break;

    }

    return 0;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2050525.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java方法03:方法的重载

本节内容视频链接&#xff1a;https://www.bilibili.com/video/BV12J41137hu?p47&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5https://www.bilibili.com/video/BV12J41137hu?p47&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 在Java中&#xff0c;‌方法的重载&#x…

AI编程系列一1小时完成链家房价爬虫程序

背景 AI编程实在太火&#xff0c;写了很多年的Java&#xff0c;现在Python 和Go 简单好用&#xff0c;今天结合智谱清言快速完成一个程序爬虫程序&#xff0c;没有任何Python 编程经验&#xff0c;只需要会提问&#xff0c;熟悉简单HTML结构即可。未来一定是有业务能力者的福…

Anylogic设置颜色

三维对象的颜色修改 以detector智能体为例&#xff0c;颜色修改代码为&#xff1a; detector.setColor(“Material_(4)_Surf”,blue); 二维对象的颜色修改 house智能体为例&#xff0c;对组件内的_ps282填充的颜色进行修改&#xff0c;level_是该智能体已有的参数或者称之为变…

CLRerNet推理详解及部署实现(下)

目录 前言一、CLRerNet推理(Python)1. CLRerNet预测2. CLRerNet预处理3. CLRerNet后处理4. CLRerNet推理 二、CLRerNet推理(C)1. ONNX 导出2. CLRerNet预处理3. CLRerNet后处理4. CLRerNet推理 三、CLRerNet部署1. 源码下载2. 环境配置2.1 配置CMakeLists.txt2.2 配置Makefile …

python:画由抛物线: y^2=2x 与直线 y=x-4 所围成的图形

《高等数学》同济大学版 P339 编写 test_diff_3_area.py 如下 # -*- coding: utf-8 -*- """ 画由抛物线: y^22x 与直线 yx-4 所围成的图形 """ import numpy as np import matplotlib.pyplot as plt from matplotlib.patches import Polygon…

11结构型设计模式——外观模式

一、外观模式简介 外观模式&#xff08;Facade Pattern&#xff09;是一种结构型设计模式&#xff0c;它提供了一个统一的接口来访问子系统中的一组接口&#xff0c;使得子系统的使用更加简单和方便。通过外观模式&#xff0c;可以将复杂的子系统封装在一个外观类&#xff08;…

​​数据结构-树

n = 度数之和 + 1 n + x + y + z = x +2y +3z + 1

增加练习(修改获取练习的基本信息接口)

文章目录 1.sun-club-practice-api1.enums1.CompleteStatusEnum.java 2.req1.GetPracticeSubjectsReq.java 3.vo1.PracticeSubjectListVO.java 2.sun-club-practice-server1.PracticeSetController.java2.service1.PracticeSetServiceImpl.java 3.dao1.PracticeDao.java2.Pract…

HAL STM32 SG90舵机驱动控制

HAL STM32 SG90舵机驱动控制 &#x1f516;测试对象&#xff1a;STM32F103SG90舵机 &#x1f33c;功能实现&#xff1a;通过串口指令&#xff0c;控制SG90舵机转动到指定角度。 ✨在实际硬件舵机驱动过程中&#xff0c;使用SG90普通舵机空载运转情况下&#xff0c;电流在180mA…

验证集的loss比训练集大得多Val Loss is too large

这个跟数据集有关&#xff0c;不过可已通过clip减缓。 解决方法 nn.utils.clip_grad_norm_(self.Model.parameters(), max_norm5)

AtCoder Regular Contest 182 A~D

A.Chmax Rush!&#xff08;枚举&#xff09; 题意&#xff1a; 有一个长度为 N N N的整数序列 S S S。最初&#xff0c; S S S的所有元素都是 0 0 0。 同时给你两个长度为 Q Q Q的整数序列&#xff1a; P ( P 1 , P 2 , … , P Q ) P(P_1,P_2,\dots,P_Q) P(P1​,P2​,…,PQ…

AI产品经理修炼指南:从青铜到王者的逆袭之路

一、AI通识 1.1 AI产业结构 AI发展至今大致按照在产业结构上的分工不同产生了三种类型的公司&#xff0c;我们在转型时最好要先明确自己的优势及兴趣&#xff0c;来判断自己适合着眼于哪个层面的工作&#xff0c;从而进行针对性的学习和提升。 &#xff08;1&#xff09;行业…

Apache Flink细粒度资源管理原理

粗粒度资源管理 Apache Flink 1.1.4版本之前使用的是粗粒度的资源管理&#xff0c;即每个算子Slot Request所需要的资源都是未知的&#xff0c;Flink内部用UNKNOWN的特殊值来表示&#xff0c;这个值可以和任意资源规则的物理Slot匹配&#xff0c;站在Taskmanager的角度&#x…

打卡学习Python爬虫第二天|Web请求过程刨析

一、服务器渲染 服务器端渲染&#xff08;Server-Side Rendering&#xff0c;简称SSR&#xff09;是一种网页渲染技术。在这种技术中&#xff0c;服务器在接收到客户端的请求后&#xff0c;会生成页面的初始HTML内容&#xff0c;并将其发送给客户端。客户端浏览器接收到这些HT…

什么是BKP(备份寄存器)

一&#xff0c;什么是BKP 备份寄存器是42个16位的寄存器&#xff0c;可用来存储84个字节的用户应用程序数据。他们处在备份域里&#xff0c;当VDD电源被切断&#xff0c;他们仍然由VBAT维持供电。当系统在待机模式下被唤醒&#xff0c;或系统复位或电源复位时&#xff0c;他们也…

数据结构(6.2_2)——领接表法

领接表法&#xff08;顺序存储链式存储&#xff09; 代码&#xff1a; #define MaxVertextNum 10 //边(弧) typedef struct ArcNode {int adjvex;//边/弧指向哪个结点struct ArcNode* next;//指向下一条弧的指针//InfoType info;//边权值 }ArcNode; //顶点 typedef struct VNo…

小阿轩yx-Docker Swarm 管理

小阿轩yx-Docker Swarm 管理 容器编排部署工具 除 Google 推出的 Kubernetes 之外&#xff0c;还有 Docker 发布的 Swarm 与 Mesos 推出的 Marathon 案例一 Docker Swarm 群集部署 Docker 自诞生以来&#xff0c;容器特性以及镜像特性给 DevOps 爱好者带来很多方便很长时间…

基本数据统计分析上|集中位置统计量|分散程度统计量|分布形状统计量|常见概率分布

数据统计分析 现实生活中的许多数据都是随机产生的&#xff0c;如考试分数&#xff0c;月降雨量&#xff0c;灯泡寿命等。从统计角度来看&#xff0c;这些数据其实都是符合某种分布的&#xff0c;这种分布就是统计规律性 在数学建模过程中经常与数据打交道&#xff0c;需要进行…

【鸟哥的Linux私房菜(七)之文件IO】

文章目录 C语言文件IOC语言文件接口汇总什么是当前路径&#xff1f;默认打开的三个流 系统文件I/Oopenopen的第一个参数open的第二个参数open的第三个参数open的返回值 closewriteread 文件描述符fd文件描述符的分配规则重定向重定向的原理dup2添加重定向功能到minishell FILEF…

微乐校园pf

TOC springboot451微乐校园pf 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规范化管理。这…