【Linux-Day9-进程间通信】

news2025/1/19 20:36:23

进程间通信

前提引入: 我们之前接触过管道 | 将前一个命令的输出结果作为后一个命令的输入

如:ps | grep “sleep”

其实就是将 ps 的结果写入到一个区域,在从这个区域读出目标数据

有名管道

mkfifo

创建管道文件 : mkfifo fifo ->创建一个名为fifo的管道文件

如图,管道文件的大小为0,是因为他是在内存中写入,读取,并不会占用磁盘空间,因此速度会快很多。

管道文件只有:只读,只写两种权限。

1.执行写入文件a.c

#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int fd = open("fifo",O_WRONLY);
    if(fd == -1)
    {
        printf("none file\n");
        exit(1);
    }
    char buff[128];
    while(1)
    {
        printf("intput:");
        fflush(stdout);
        fgets(buff,128,stdin);
        buff[strlen(buff)-1]=0;
        if(strcmp(buff,"end") == 0)
        {
            break;
        }
        write(fd,buff,strlen(buff));
    }
    close(fd);
    exit(0);
}

2.执行读取文件 b.c

#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int fd = open("fifo",O_RDONLY);
    if(fd == -1)
    {
        printf("none file\n");
        exit(1);
    }
    printf("fd = %d\n",fd);
    while(1)
    {
       char buff[128]={0};
       int n = read(fd,buff,127);
       if(n != 0)
       {
        printf("%s\n",buff);
       }
       else
       {
           break;
       }
    }
    close(fd);
    exit(0);
}

管道文件必须同时被只读,只写打开,否则无法成功打开

1.只写无法打开

在这里插入图片描述

2.只读无法打开

3.正确方式:只读,只写同时打开

写端关闭,读端read返回0,退出循环

读端关闭,写端write时会收到异常信号(SIGPIPE),进而结束该进程

验证是否产生该信号

写端a.c 测试代码:

#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>

void fun_sig(int sig)
{
    printf("%d,%d\n",sig,13 == sig);
}
int main()
{
    signal(SIGPIPE,fun_sig);
    int fd = open("fifo",O_WRONLY);
    if(fd == -1)
    {
        printf("none file\n");
        exit(1);
    }
    char buff[128];
    while(1)
    {
        printf("intput:");
        fflush(stdout);
        fgets(buff,128,stdin);
        buff[strlen(buff)-1]=0;
        if(strcmp(buff,"end") == 0)
        {
            break;
        }
        write(fd,buff,strlen(buff));
    }
    close(fd);
    exit(0);
}

如图:

有名管道能在任意两个进程间使用

无名管道

利用函数 int pipe(int fds[2]);

int pipe(int fds[2]);

pipe()成功返回 0,失败返回-1

fds[0]是管道读端的描述符

fds[1]是管道写端的描述符

测试代码:

#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>

int main()
{
    int fd[2];
    if(pipe(fd) == -1)  exit(1);
   int pid = fork();
    if(pid == 0)
    {
        close(fd[0]);
        printf("child input\n");
        write(fd[1],"hello",6);
    }
    else
    {
        char buff[128]={0};
        close(fd[1]);
        printf("parent read:");
        read(fd[0],buff,127);
        printf("%s\n",buff);
    }
    exit(0);
}


如图:

无名管道主要应用于父子进程间的通信。

管道的特点

◼ 无论有名还是无名,写入管道的数据都在内存中

◼ 管道是一种半双工通信方式(通信方式有单工、半双工、全双工)

◼ 有名和无名管道的区别:有名可以在任意进程间使用,而无名主要在父子进程间

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

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

相关文章

verilator——牛刀小试

verilator——牛刀小试 安装verilator可见&#xff1a;https://blog.csdn.net/qq_40676869/article/details/132648522?spm1001.2014.3001.5501 正文开始 编写一个异或的电路模块如下&#xff1a; top.v module top(input a,input b,output f );assign f a ^ b; endmodul…

[华为云云服务器评测] 华为云耀云服务器 Java、node环境配置

系列文章目录 第一章 [linux实战] 华为云耀云服务器L实例 Java、node环境配置 文章目录 系列文章目录前言一、任务拆解二、修改密码三、配置安全规则四、远程登录并更新apt五、安装、配置JDK环境5.1、安装openjdk,选择8版本5.2、检查jdk配置 六、安装、配置git6.1、安装git6.2…

【从0学习Solidity】合约入门 Hello Web3

【学习Solidity的基础】入门智能合约开发 Hello Web3 &#x1f4f1;不写代码没饭吃上架主页 在强者的眼中&#xff0c;没有最好&#xff0c;只有更好。我们是全栈开发领域的优质创作者&#xff0c;同时也是阿里云专家博主。 ✨ 关注我们的主页&#xff0c;探索全栈开发的无限…

torch.bmm功能解读

bmm 是 batch matrix multiple 的简写&#xff0c;即批量矩阵乘法&#xff0c;矩阵是二维的&#xff0c;加上batch一个维度&#xff0c;因此该函数的输入必须是两个三维的 tensor&#xff0c;三个维度代表的含义分别是&#xff1a;&#xff08;批量&#xff0c;行&#xff0c;列…

递归与递推

会独立敲一遍代码并debug&#xff08;1&#xff0c;3题较难&#xff1b;2&#xff0c;4题较简单&#xff09; 部分题需要买课&#xff0c;可到洛谷或其他OJ找原题 目录 &#x1f4d5;空间复杂度(计算方法) &#x1f33c;1&#xff0c;费解的开关 &#x1f33c;2&#xff0c;…

图神经网络教程之HAN-异构图模型

异构图 包含不同类型节点和链接的异构图 异构图的定义&#xff1a;节点类别数量和边的类别数量加起来大于2就叫异构图。 meta-path元路径的定义&#xff1a;连接两个对象的复合关系&#xff0c;比如&#xff0c;节点类型A和节点类型B&#xff0c;A-B-A和B-A-B都是一种元路径。 …

[C++] STL_list常用接口的模拟实现

文章目录 1、list的介绍与使用1.1 list的介绍1.2 list的使用 2、list迭代器3、list的构造4、list常用接口的实现4.1 list capacity4.2 插入删除、交换、清理4.2.1 insert任意位置插入4.2.2 push_front头插4.2.3 push_back尾插4.2.4 erase任意位置删除4.2.5 pop_front头删4.2.6 …

Keil 编译 Debug

# 头文件无法导入进来 # 导入头文件&#xff0c;只有函数声明&#xff0c;但缺少函数实现 已经导入了air32f10x_gpio.h但是没有导入 .c&#xff0c;就导致 编译出错出现undefined symbol (某个函数)&#xff0c;这时候按照下面的操作&#xff0c;导入外设模块就好。

PQUEUE - Printer Queue

题目描述 The only printer in the computer science students union is experiencing an extremely heavy workload. Sometimes there are a hundred jobs in the printer queue and you may have to wait for hours to get a single page of output. Because some jobs are …

pip切换源

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

CLFS信息泄露漏洞CVE-2023-28266分析

引用 这篇文章的目的是介绍今年4月发布的CLFS信息泄露漏洞CVE-2023-28266分析. 文章目录 引用简介CVE-2023-28266漏洞分析CVE-2023-28266调试过程漏洞复现相关引用参与贡献 简介 文章结合了逆向代码和调试结果分析了CVE-2023-28266漏洞利用过程和漏洞成因. CVE-2023-28266漏洞…

两个线程同步执行:解决乱箭穿心(STL/Windows/Linux)

C自学精简教程 目录(必读) C并发编程入门 目录 多线程同步 线程之间同步是指线程等待其他线程执行完某个动作之后再执行&#xff08;本文情况&#xff09;。 线程同步还可以是像十字路口的红绿灯一样&#xff0c;只允许一个方向的车同行&#xff0c;其他方向的车等待。 本…

UART串口Shell软硬件模型分析总结

文章目录 层次一、最底层逻辑配置交互----如何从Uart硬件读写单个字节数据层次二、抽象串口软件模块交互----基于串口对接输入输出流 和 Printf适配层次三、类似Shell封装抽象交互----基于串口交互命令行界面&#xff08;命令解析、补全、修改、记录&#xff09;case1 依次输入…

自建音乐服务器Navidrome之一

这里写自定义目录标题 1.1 官方网站 2. Navidrome 简介2.1 简介2.2 特性 3. 准备工作4. 视频教程5. 界面演示5.1 初始化页5.2 专辑页 前言 之前给大家介绍过 Koel 音频流服务&#xff0c;就是为了解决大家的这个问题&#xff1a;下载下来的音乐&#xff0c;只能在本机欣赏&…

上海的正西边有哪些城市

背景 上海一路向西&#xff0c;来一趟拉萨之行&#xff0c;那么上海出现&#xff0c;所经过的那么多城市&#xff0c;哪些是在上海的正西边呢&#xff1f; 画一幅地图 基于这个背景需求&#xff0c;我们需要拿来一幅地图&#xff0c;一看便知。下面的python代码生成了一幅地…

通信原理板块——平稳随机过程

微信公众号上线&#xff0c;搜索公众号小灰灰的FPGA,关注可获取相关源码&#xff0c;定期更新有关FPGA的项目以及开源项目源码&#xff0c;包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 1、平稳随机过程的定义 (1)严平稳随…

UE4 显示遮挡物体

SceneDepth是你相机能够看见的物体的深度距离 CustomDepth是你相机包括看不见被遮挡的物体的深度距离 如果CustemDepth比SceneDepth的距离相等&#xff0c;那么就是没有被遮挡的物体&#xff0c;如果被遮挡那么就是CustemDepth比SceneDepth深度距离远&#xff0c;然后再做对应…

PYTHON知识点学习-循环语句

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是Aileen★。希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f194;本文由 Aileen_0v0★ 原创 CSDN首发&#x1f412; 如需转载还…

【机器学习】线性回归

Model Representation 1、问题描述2、表示说明3、数据绘图4、模型函数5、预测总结附录 1、问题描述 一套 1000 平方英尺 (sqft) 的房屋售价为300,000美元&#xff0c;一套 2000 平方英尺的房屋售价为500,000美元。这两点将构成我们的数据或训练集。面积单位为 1000 平方英尺&a…

Swift 如何从图片数据(Data)检测原图片类型?

功能需求 如果我们之前把图片对应的数据(Data)保持在内存或数据库中,那么怎么从 Data 对象检测出原来图片的类型呢? 如上图所示:我们将 11 张不同类型的图片转换为 Data 数据,然后从 Data 对象正确检测出了原图片类型。 目前,我们的代码可以检测出 jpeg(jpg), tiff,…