Linux 7种 进程间通信方式

news2024/10/5 21:35:50

传统进程间通信

        通过文件实现进程间通信 必须人为保证先后顺序        A--->硬盘---> B(B不知道A什么时候把内容传到硬盘中)

1.无名管道

2.有名管道

3.信号

IPC进程间通信

4.消息队列

5.共享内存

6.信号灯集

7.socket通信

一、无名管道(亲缘关系的进程   64K)

原理:

        如果A和B进程想要通过无名管道通信,那就必须在内核空间创建一个无名管道(64K),A和B进程必须是亲缘关系的进程,A进程向管道的一端写数据,B进程可以从管道的另外一端读数据。在A进程和B进程进行数据传输的时候是不允许使用lseek函数的。无名管道是半双工的通信方式。如果A进程一直向管道中写数据写满64K的时候A进程阻塞,直到B进程读一部分数据之后A才能继续写。如果B进程在读数据的时候,无名管道是空的,B进程阻塞。(PS:使用无名管道时,不会创建管道文件,使用有名管道文件,会创建)

API

int pipe(int pipefd[2]);
功能:创建一个无名管道
参数:
    @pipefd[2]:返回的管道的两端
     pipefd[1]:写端
     pipefd[0]:读端
返回值:成功返回0,失败返回-1置位错误码

实例

#include <head.h>
// 子进程从终端读取字符串 通过无名管道 父进程读 然后打印到终端
int main(int argc, const char *argv[])
{
    int pipefd[2];
    if (-1 == pipe(pipefd))
    {
        perror("pipe error");
        exit(-1);
    };
    char buff[128] = {0};
    pid_t pid;
    pid = fork();
    if (pid == -1)
    {
        perror("fork error");
        exit(-1);
    }
    else if (pid == 0)
    {
        // 子进程
        close(pipefd[0]); // 关闭子进程的读端   因为父子进程同时各自拥有读和写 把对应的关一个
        while (1)
        {
            memset(buff, 0, sizeof(buff));
            fgets(buff, sizeof(buff), stdin); // 从终端读取数据
            if ((buff[strlen(buff) - 1]) == '\n')
            {
                buff[strlen(buff) - 1] = '\0';
            }
            write(pipefd[1], buff, sizeof(buff)); // 将读到的写入到管道
            if (strcmp(buff, "quit") == 0)
            {
                break;
            }
        }
        close(pipefd[1]);
        exit(0);
    }
    else
    {
        // 父进程
        close(pipefd[1]); // 关闭父进程的写端
        while (1)
        {
            memset(buff, 0, sizeof(buff));
            read(pipefd[0], buff, sizeof(buff)); // 父进程从管道中读
            printf("父进程data:%s\n", buff);
            if (strcmp(buff, "quit") == 0)
            {
                break;
            }
        }
        close(pipefd[2]);
        wait(NULL);
    }
    return 0;
}

结果

二、有名管道(任意进程间的通信    64K)

有名管道可以实现任意进程间的通信,有名管道的大小也是64K,有名管道也是不支持lseek,有名管道也是半双工的通信方式。有名管道创建之后会在用户空间产生一个管道文件(p),这个管

文件是在内存上存储的。如果A和B两个进程想要通过有名管道通信,就打开管道文件,向管道中写向管道中读就可。

API

int mkfifo(const char *pathname, mode_t mode);
功能:创建有名管道
参数:
    @pathname:有名管道文件的路径及名字
 @mode: 管道文件的权限(mode & ~umask)
返回值:成功返回0,失败返回-1置位错误码

实例

01mkfifo.c

#include <head.h>
#define FIFO_PATH "./myfifo"
int main(int argc,const char * argv[])
{
    //创建管道文件
    if(mkfifo(FIFO_PATH,0666)==-1){
        perror("mkfifo error");
        exit(-1);
    }
    //阻塞等待读写
    getchar();
    //删除管道文件
    char buff[128]={0};
    snprintf(buff,sizeof(buff),"rm -rf %s",FIFO_PATH);
    system(buff);
    return 0;
}

02read.c

#include <head.h>
#define FIFO_PATH "./myfifo"
int main(int argc, const char *argv[])
{
    int fd;
    char buff[128] = {0};
    if (-1 == (fd = open(FIFO_PATH, O_RDONLY)))
    {
        perror("open error");
        exit(-1);
    }
    while (1)
    {
        memset(buff, 0, sizeof(buff));
        read(fd, buff, sizeof(buff));
        printf("read:[%s]\n", buff);
        if (strcmp(buff, "quit") == 0)
        {
            break;
        }
    }
    close(fd);
    return 0;
}

03write.c

#include <head.h>
#define FIFO_PATH "./myfifo"
int main(int argc, const char *argv[])
{
    int fd;
    char buff[128] = {0};
    if (-1 == (fd = open(FIFO_PATH, O_WRONLY)))
    {
        perror("open error");
        exit(-1);
    }
    while (1)
    {
        memset(buff, 0, sizeof(buff));
        printf("input:");
        fgets(buff,sizeof(buff),stdin);
        if(buff[strlen(buff)-1]=='\n'){
            buff[strlen(buff)-1]='\0';
        }
        write(fd, buff, sizeof(buff));
        if (strcmp(buff, "quit") == 0)
        {
            break;
        }
    }
    close(fd);
    return 0;
}

结果

 三、信号

信号软件层面对中断一种模拟,用户可以给进程发送信号,内核也可以给进程发送信号,进程对信号的响应方式有三种:捕捉,默认,忽略

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

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

相关文章

《书生·浦语大模型实战营》第5课 学习笔记:LMDeploy 量化部署 LLM 实践

文章大纲 0.背景知识与简介计算机组成原理&#xff1a;变量的存储参数量与推理的关系 1.LMDeploy环境部署1.1 创建开发机1.2 创建conda环境InternStudio开发机创建conda环境&#xff08;推荐&#xff09;本地环境创建conda环境 1.3 安装LMDeploy 2.LMDeploy模型对话(chat)2.1 H…

Golang | Leetcode Golang题解之第187题重复的DNA序列

题目&#xff1a; 题解&#xff1a; const L 10 var bin map[byte]int{A: 0, C: 1, G: 2, T: 3}func findRepeatedDnaSequences(s string) (ans []string) {n : len(s)if n < L {return}x : 0for _, ch : range s[:L-1] {x x<<2 | bin[byte(ch)]}cnt : map[int]in…

Python | Leetcode Python题解之第187题重复的DNA序列

题目&#xff1a; 题解&#xff1a; L 10 bin {A: 0, C: 1, G: 2, T: 3}class Solution:def findRepeatedDnaSequences(self, s: str) -> List[str]:n len(s)if n < L:return []ans []x 0for ch in s[:L - 1]:x (x << 2) | bin[ch]cnt defaultdict(int)for…

期货交易纪律2024年6月22号

文章目录 期货交易系统构建第一步、选品第二步、开仓纪律第三步、持仓 2024年6月22号&#xff0c;开始写期货交易的第三篇日记。 交易记录&#xff1a;市场继续震荡&#xff0c;这两天无交易&#xff0c;继续梳理一些期货交易选品&#xff0c;周末详细的了解了一下豆粕&#xf…

axure制作菜单下拉、隐藏、点击选中效果

在高保真原型中&#xff0c;制作导航栏菜单时&#xff0c;需要达到点击下拉按钮&#xff0c;子菜单自动弹出&#xff0c;点击其中一个子菜单项可栏目变为选中状态且跳转到对应的子页面。制作材料可以从antdesign中去下载&#xff0c;以下述网络配置菜单为例。在箭头处添加互动效…

Pytest和Unitest框架对比

在学到自动化的时候,很多同学都遇到了Pytest和Unitest框架,有的人是两个都学,但是学的不精只是知道分别怎么用.不了解两个区别是什么.有的是犹豫到底要学习那个框架.其实要做好自动化测试,是有必要了解不同框架之间的差异化的. Pytest 特点: Pytest采用了更简洁、更灵活的语法…

C语言 | Leetcode C语言题解之第187题重复的DNA序列

题目&#xff1a; 题解&#xff1a; #define MAXSIZE 769/* 选取一个质数即可 */ typedef struct Node {char string[101];int index;struct Node *next; //保存链表表头 } List;typedef struct {List *hashHead[MAXSIZE];//定义哈希数组的大小 } MyHashMap;List * …

【建设方案】大数据湖一体化建设方案(ppt原件)

1、背景&#xff1a;大数据湖的发展背景与建设理念 2、体系&#xff1a;大数据湖体系规划与建设思路 3、生态圈&#xff1a;探索新兴业务入湖建设模式 4、共享&#xff1a;大数据湖统一访问共享规划 5、运营&#xff1a;大数据湖一体化运营管理建设 &#xff08;本方案及更多方…

交通大数据分析与挖掘实训【对提供的CSV格式数据使用pandas库分析-Matplotlib库绘图】

背景&#xff1a; 《交通大数据分析与挖掘》实训 指 导 书 编著 二○二四年五月 一、实训目的 1、掌握python开发环境&#xff08;如Anaconda&#xff09;及Numpy等常见第三方库的使用&#xff1b; 2、熟悉Anaconda在线编程平台&#xff0c;学会基本的python程序编写…

CMake笔记之CMAKE_INSTALL_PREFIX详解以及ROS中可执行文件为什么会在devel_lib中

CMake笔记之CMAKE_INSTALL_PREFIX详解以及ROS中可执行文件为什么会在devel_lib中 code review! 文章目录 CMake笔记之CMAKE_INSTALL_PREFIX详解以及ROS中可执行文件为什么会在devel_lib中1.CMAKE_INSTALL_PREFIX详解变量作用设置 CMAKE_INSTALL_PREFIX示例影响范围常见用法特别…

OpenHarmony 应用开发FullSDK获取与替换

DevEco Studio是OpenHarmony应用集成开发环境。public-SDK是提供给应用开发的工具包&#xff0c;跟随DevEco Studio下载&#xff0c;不包含系统应用所需要的高权限API。full-SDK是提供给OEM厂商开发应用的工具包&#xff0c;不能随DevEco Studio下载&#xff0c;包含了系统应用…

了解请求参数与响应参数的区别:初学者指南

在 Web 的开发领域&#xff0c;无论你是前端开发还是后端开发人员&#xff0c;把握请求与响应参数的核心差异是极其重要的。这些参数在客户端和服务器之间的互动中扮演着关键角色。 请求参数的定义及类别 定义 当客户端向服务器提交信息时所使用的数据被称为请求参数。这些参…

Fine-tuning在垂直领域的最佳实践指南

对于Fine-tuning是深度学习和机器学习领域一个特别重要的概念&#xff0c;并且每个企业的实践方式也会有所不同&#xff0c;今天我们就来聊一聊Fine-tuning。 什么是Fine-tuning Fine-tuning指的是模型微调&#xff0c;通常是指在一个预训练模型的基础上&#xff0c;通过在特…

【剖析】为什么说RBF神经网络的误差为0

本文来自《老饼讲解-BP神经网络》https://www.bbbdata.com/ 机器学习中的模型非常的多&#xff0c;但如果要问有没有这样的一个模型&#xff0c;它的训练误差为0&#xff0c;那么就非RBF神经网络莫属了&#xff01;下面我们来聊聊&#xff0c;为什么RBF神经网络的训练误差为0。…

Springboot多模块项目从0构建打包运行

今天复习了一下Springboot的多模块的构建&#xff0c;其实一直以来都对单体项目使用多模块感到不太理解&#xff0c;不知道到底有什么样的优势&#xff0c;目前切身体会到的优势就是确实可以让依赖的划分更加清晰&#xff08;每个模块下的pom文件只引入该模块需要的依赖&#x…

数据分析的线上云端数据库搭建及Excel和Tableau连接

数据分析的线上云端数据库搭建及Excel和Tableau连接 SQL基础知识 线上SQL训练&#xff1a; SQlZOO: https://www.sqlzoo.net/wiki/SQL_Tutorial 牛客网SQL真题&#xff1a;https://www.nowcoder.com/ta/sql select,from,where, order by, limit, group by, having, substr(),…

HTML 之<title> 标签

一.HTML <title> 标签 二.实例 为您的 HTML 文档定义标题&#xff1a; <html> <head> <meta charset"utf-8"> <title>文档标题</title> </head> <body> 文档内容...... </body> </html> 尝试一下 三…

[问题记录]Qt QGraphicsItem 移动时出现残影

目录 1.问题现象 2.问题原因 3.修改方案 1.问题现象 自定义 QGraphicsItem 时&#xff0c;绘制rect&#xff0c;对象移动时出现残影。 2.问题原因 直接原因是view未刷新的问题&#xff0c;所以网上有人使用方案 setViewportUpdateMode(QGraphicsView::FullViewportUpdate…

周末设计高端企业_集团官网主题Discuz模板

风格名称: 周末设计_高端企业_集团官网 适用版本: Discuz! X3.0、X3.1、X3.2、X3.3、F1.0 风格编码: 使用语言包结构&#xff0c;适合全部编码 周末设计高端企业_集团官网主题Discuz模板

黑苹果EFI详细配置说明

先上网址: https://dortania.github.io/OpenCore-Install-Guide/installer-guide/opencore-efi.html 1: 了解作用 ACPI作用: 总结: ACPI是UEFI引导方式和操作系统之间的硬件抽象接口,概述了硬件设备,如 USB 控制器、CPU 线程、嵌入式控制器、系统时钟等 硬件设备识别和驱动:…