进程间通信、无名管道、有名管道

一、进程

1.1 进程间通信的概念

        线程通信通过全局变量即可。

        进程间通信是相互独立的,但是所有进程都共用一份内核空间,所以进程和进程之间的通信可以通过内核去进行。

1.2 进程间通信方式

共7种:

  1. 传统的进程间通信方式:
    1. 无名管道
    2. 有名管道
    3. 信号
  2. systemV版本的IPC进程间通信:
    1. 消息队列
    2. 共享内存
    3. 信号灯集
  3. BSD版本的:
    1. socket实现本地通信

1.3 无名管道

1.3.1 无名管道的概念和特性

无名管道在内核中开辟一块内存空间,用于进程间的通信。

无名管道创建之后,回想用户返回两个文件描述符,一个读端文件描述符,一个写端文件描述符。读端文件描述符,用于从管道中读取数据,写端文件描述符,用于向管道中写入数据。

无名管道只能用于亲缘间进程的通信。

无名管道大小是64K。

1.3.2 无名管道的API

#include <unistd.h>
int pipe(int pipedf[2]);
功能:创建一个无名管道
参数:pipefd:保存内核返回的管道的两端pipedf[0]:管道的读端pipedf[1]:管道的写端
返回值:成功返回0,失败返回-1,置位错误码

1.3.3 无名管道运行实例:

#include <my_head.h>int main(int argc,const char *argv[]){int ret = 0;int pipedf[2] = {0};//创建无名管道ret = pipe(pipedf);if(-1 == ret){PRINT_ERR("create pipe error");}//创建子进程ret = fork();if(-1 == ret){PRINT_ERR("fork error");}else if(0 == ret){//子进程,关闭读char send_buf[128] = {0};close(pipedf[0]);while(1){fgets(send_buf,sizeof(send_buf),stdin);send_buf[strlen(send_buf)-1] = '\0';write(pipedf[1],send_buf,strlen(send_buf));if(!strcmp(send_buf,"quit"))break;}close(pipedf[1]);}else{//父进程,关闭写char recv_buf[128] = {0};close(pipedf[1]);while(1){memset(recv_buf,0,sizeof(recv_buf));read(pipedf[0],recv_buf,sizeof(recv_buf));if(!strcmp(recv_buf,"quit"))break;printf("我是父进程,我收到了数据[%s]\n",recv_buf);}close(pipedf[0]);wait(NULL);}return 0;
}

运行结果:

无名管道的读写特点:

如果读端关闭,向管道写数据:

        管道破裂,祥管道写入数据的进程会收到管道破裂的信号,这个信号会杀死该进程。

如果独断打开(不读),一直写:

        有多少写多少,管道满了之后(管道大小是164K),会在write的地方阻塞

如果写端不存在,读数据:

        如果管道中有数据,就读数据,如果没有数据就立即返回。

如果写端存在(不写),读数据,有数据就读数据,没数据就在read的地方阻塞

1.4有名管道

1.4.1 有名管道的特点

        有名管道在内核中开辟一块内存空间,用于进程间的通信。

        有名管道创建之后,会在文件系统中创建一个管道文件。

        两个进程想要进行通信的时候,可以通过open函数1打开管道文件,然后向管道中写入内容,或者读取内容,实现进程间的通信。

这个管道文件本质上是保存在内存上的。

有名管道可以用于任意进程间通信。

有名管道大小为64K。

2.4.2 创建有名管道的API

#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname,mode_t mode);
功能:创建一个有名管道
参数:pathname:管道文件的路径和名字mode:创建文件的权限(mode & ~umask)
返回值:成功返回0,失败返回-1,置位错误码mkfifo 管道文件名 --- 通过命令创建一个有名管道

1.4.3 有名管道使用示例

mkfifo.c

#include <my_head.h>int main(int argc,const char *argv[]){mkfifo("./fifo",0666);getchar();//system("rm fifo");remove("./fifo");//删除文件return 0;
}

read.c

#include <my_head.h>int main(int argc,const char *argv[]){int fd = 0;//1.打开管道文件,以只读的方式打开fd = open("./fifo",O_RDONLY);if(-1 == fd){PRINT_ERR("open fifo error");}char recv_buf[128] = {0};//2.开始循环读while(1){memset(recv_buf,0,sizeof(recv_buf));read(fd,recv_buf,sizeof(recv_buf));if(!strcmp(recv_buf,"quit"))break;printf("读到了数据[%s]\n",recv_buf);}close(fd);return 0;
}

write.c

#include <my_head.h>int main(int argc,const char *argv[]){int fd = 0;//1.以只读方式打开管道文件fd = open("./fifo",O_WRONLY);if(-1 == fd){PRINT_ERR("open fifo error");}char send_buf[128] = {0};//2.开始循环写 while(1){fgets(send_buf,sizeof(send_buf),stdin);send_buf[strlen(send_buf) - 1] = '\0';write(fd,send_buf,strlen(send_buf));if(!strcmp(send_buf,"quit"))break;}close(fd);return 0;
}

有名管道的读写特点:

如果读端没有打开,写管道:

        在open的位置阻塞。

如果读端打开(不读),写管道:

        有多少写多少,写满为止,写阻塞。

读端打开后关闭,写管道:

        管道破裂,向写管道的进程发送管道破裂信号,杀死该进程。

如果写端没打开,读管道:

        在open的位置阻塞。

写端打开(不写),读管道:

        有数据就读数据,没数据,在read的地方阻塞。

写端打开后关闭,读管道:

        有数据就读数据,没数据就立即返回。

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

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

相关文章

VSCode 查看 Git 的历史记录的三种技巧

前言 在我们日常开发工作过程中&#xff0c;可能经常会看到一些离谱的历史代码&#xff0c;或者当项目发生线上事故时&#xff0c;如何快速定位是谁提交的代码导致的&#xff1f; 作为前端开发者&#xff0c;VSCode 是目前最为流行的代码编辑工具&#xff0c;也是日常最常打开…

OPC UA与PostgreSQL如何实现无缝连接?

随着工业4.0的推进&#xff0c;数据交换和集成在智能制造中扮演着越来越重要的角色。OPC UA能够实现设备与设备、设备与系统之间的高效数据交换。而PostgreSQL则是一种强大的开源关系型数据库管理系统&#xff0c;广泛应用于数据存储和管理。如何将OPC UA与PostgreSQL结合起来&…

python pip安装requirements.txt依赖与国内镜像

python pip安装requirements.txt依赖与国内镜像 如果网络通畅&#xff0c;直接pip安装依赖&#xff1a; pip install -r requirements.txt 如果需要国内的镜像&#xff0c;可以考虑使用阿里的&#xff0c;在后面加上&#xff1a; -i http://mirrors.aliyun.com/pypi/simple --…

基于System.js的微前端实现(插件化)

目录​​​​​​​ 写在前面 一、微前端相关知识 &#xff08;一&#xff09;概念 &#xff08;二&#xff09; 优势 &#xff08;三&#xff09; 缺点 &#xff08;四&#xff09;应用场景 &#xff08;五&#xff09;现有框架 1. qiankun 2. single-spa 3. SystemJ…

GO之流程控制

一、流程控制简述 一&#xff09;流程控制的作用 流程控制语句是用来控制程序中语句执行顺序的语句&#xff0c;可以把语句组合成能完成一定功能的小逻辑块 二&#xff09;流程控制的分类 控制语句分为三类&#xff1a;顺序、选择和循环 顺序结构&#xff1a;依次执行&#xf…

通过Express + Vue3从零构建一个用户认证与授权系统(二)数据库与后端项目搭建与实现

前言 上一篇完成了系统的相关设计文档的编写&#xff0c;本文将详细介绍如何一步步使用 TypeScript 和 Express 搭建一个模块化、类型安全的用户认证与授权系统&#xff0c;包括数据库设计、后端项目搭建、用户认证、角色与权限管理、错误处理以及 Swagger 文档集成。 项目准…

Label Studio 半自动化标注

引言 Label Studio ML 后端是一个 SDK,用于包装您的机器学习代码并将其转换为 Web 服务器。Web 服务器可以连接到正在运行的 Label Studio 实例,以自动执行标记任务。我们提供了一个示例模型库,您可以在自己的工作流程中使用这些模型,也可以根据需要进行扩展和自定义。 1…

Ubuntu22.04环境下源码安装OpenCV 4.8.1

因为项目需要用OpenCV对yolov8模型进行推理&#xff0c;通过DNN模块&#xff0c;之前本地的OpenCV版本是4.5.4&#xff08;好像安装完ROS2 humble之后系统就自带了opencv&#xff09;&#xff0c;加载onnx模型一直报错&#xff0c;网上查询到需要4.7以上&#xff0c;干脆直接升…

开发教程 | 插件使用常见问题与调用攻略

Q1&#xff1a;插件是什么&#xff1f; 插件可以理解为是在一些专业领域上的单独的专精模型&#xff0c;比如专门生成PPT的模型、专门生成简历的模型。 大模型本身其实只是一个文字生成工具&#xff0c;只能根据自己在预训练过程中投入的语料以及用户的指令来回答问题。这给大…

内核定时器API实现点灯

1.内核定时器 定时器是一个很常用的功能&#xff0c;需要周期性处理的工作都要用到定时器。 Linux 内核定时器 采用系统时钟来实现&#xff0c;并不是6ull里面的硬件定时器。 Linux 内核定时器使用很简单&#xff0c;只需要提供超时时间(相当于定时值)和定时处理函数即…

500万人报名的软考到底是什么?有什么用?考什么?怎么报名?

软考是目前中国计算机领域最权威的认证考试之一&#xff0c;被广大IT从业者视为职业生涯发展的重要里程碑。通过参加软考&#xff0c;考生可以获得国家级资格认证&#xff0c;证明其具备一定的计算机专业知识和技能。本文将详细介绍软考的相关信息&#xff0c;帮助读者了解软考…

大数据-159 Apache Kylin 构建Cube 准备和测试数据

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

QT TCP服务器/客户端

服务器 首先要在.pro文件中添加network&#xff0c;否则将不能使用QTcpserver QT core gui network#ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> #include <QTcpSocket> #define PORT 8000QT_BEGIN_NAMESPACE namesp…

使用Rollup.js快速开始构建一个前端项目

Rollup 是一个用于 JavaScript 项目的模块打包器&#xff0c;它将小块代码编译成更大、更复杂的代码&#xff0c;例如库或应用程序。Rollup 对代码模块使用 ES6 模块标准&#xff0c;它支持 Tree-shaking&#xff08;摇树优化&#xff09;&#xff0c;可以剔除那些实际上没有被…

第7章 网络请求和状态管理

一、Axios 1 Axios概述 Axios是一个基于Promise的HTTP库&#xff0c;可以发送get、post等请求&#xff0c;它作用于浏览器和Node.js中。当运行在浏览器时&#xff0c;使用XMLHttpRequest接口发送请求&#xff1b;当运行在Node.js时&#xff0c;使用HTTP对象发送请求。 Axios的…

【jeston】torch相关环境安装

参考&#xff1a;玩转NVIDIA Jetson &#xff08;25&#xff09;— jetson 安装pytorch和torchvision torch install 安装环境 conda create -n bisenet python3.8 conda activate bisenethttps://forums.developer.nvidia.com/t/pytorch-for-jetson/72048 import torch pri…

java异步多线程Async学习记录

java异步多线程Async学习记录 第1步:声明线程池AsyncConfiguration import org.springframework.context.annotation.Bean; import org.springframework

关联信息融合的知识图补全方法

目前&#xff0c;一些基于知识表示学习的补全方法没有充分考虑多步关系路径中各关系与直接关系之间的关联信息&#xff0c;以及头尾实体类型与直接关系之间的关联信息。 本论文对这些关联信息进行提取和利用&#xff0c;并提出了知识图补全的AiTransE模型。该模型利用首尾实体之…

基于华为云智慧生活生态链设计的智能鱼缸

一. 引言 1.1 项目背景 随着智能家居技术的发展和人们对高品质生活的追求日益增长&#xff0c;智能鱼缸作为一种结合了科技与自然美的家居装饰品&#xff0c;正逐渐成为智能家居领域的新宠。本项目旨在设计一款基于华为云智慧生活生态链的智能鱼缸&#xff0c;它不仅能够提供…

BugReport中的网络差现象

一、摘要 当出现网络不好时(日志关键字“process data stall”)&#xff0c;会出现com.android.networkstack.process 后台进程联网访问“http://www.google.cn/generate_204”进行网络检测的行为&#xff0c;会额外带来功耗电流。遇到这种情况&#xff0c;主要是环境因素&…