2、进程通信

2023-11-09

进程通信

1、进程建通信概述

1、目的:

为何需要进程间通信?

1、数据传输
一个进程需要将他的数据发送给另外一个进程。
2、资源共享
多个进程之间共享同样的资源。
3、通知事件
一个进程需要向一个或一组进程发送消息,通知它发生了某种事件。
4、进程控制
有些进程希望完全控制另一程序的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有操作,并能够及时知道他的状态改变。

2、来源:

linux进程间通信(IPC)是由以下几部分发展而来:
1、UNIX进程间通信;
2、基于system V进程间通信;
3、POSIX进程间通信;

注意:
posix是可移植操作系统接口;

3、进程间通讯方式包括:

1、管道(pipe)和有名管道(FIFO)
2、信号(signal)
3、消息队列
4、共享内存
5、信号量
6、套接字(socket)

2、管道通讯

特点:先进先出,尾进头出;
1、管道创建:
管道包括无名管道和有名管道两种:
无名管道:用于父进程和子进程之间的通信;
有名管道:用于同一系统之间任意两个进程;

1、无名管道:

(1)通过 pipe() 函数创建无名管道:

int pipe(int filedis[2]);

当一个管道创建之后,会建立两个文件描述符:

filedis[0]:用于读管道;
filedis[1]:用于写管道;

实例 1:

创建一个管道;



#include<unistd.h>
#include<errno.h>
#include<stdio.h>
#include<stdlib.h>

int main()
{
	int pipe_fd[2];//定义两个int类型的文件描述符;
	printf("fd[0]=%d,fd[1]=%d\n",pipe_fd[0],pipe_fd[1]);
//未创建管道符之前,
	if(pipe(pipe_fd)<0)
	{
		printf("pipe create error\n");
		return -1;	

	}
	else
	{
		//创建管道符之后,管道描述符的数值;
		printf("fd[0]=%d,fd[1]=%d\n",pipe_fd[0],pipe_fd[1]);
		printf("pipe create success\n");
	}
	
	close(pipe_fd[0]);
	close(pipe_fd[1]);
}

注意:
必须在系统调用fork()之前先调用pipe(),否则子进程将无法继承文件的描述符。
即:先铺管道,才有进程。

否则的话会创建两个管道:父进程一个,子进程一个,个用个的。

实例 2:

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

int main()
{
	int pipe_fd[2];
	pid_t pid;
	char buf_r[100];
	char * p_wbuf;
	int r_num;

	memset(buf_r,0,sizeof(buf_r));
	
	//创建管道;
	if(pipe(pipe_fd)<0)
	{
		printf("pip create error\n");
		return -1;
	}
	//创建子进程;
	if((pid=fork())==0) //子进程执行序列
	{
		printf("\n");
		close(pipe_fd[1]);//子进程先关闭了管道的写端
		sleep(2);//为何睡眠?/*让父进程先运行,这样父进程先写子进程才有内容读*/
		if ((r_num=read(pipe_fd[0],buf_r,100))>0)
		{
			printf("%d numbers read from the pipe is %s\n",r_num,buf_r);
		}
		close(pipe_fd[0]);
		exit(0);
	}
	else if(pid>0)//父进程执行序列
	{
		close(pipe_fd[0]); //父进程先关闭了管道的读端
		if (write(pipe_fd[1],"hello",5)!=-1)
			printf("parent write hello! \n");
		if(write(pipe_fd[1],"pipe",5)!=-1)
			printf("parent write pipe! \n");
		close(pipe_fd[1]);
		waitpid(pid,NULL,0); /*等待子进程结束*/
		exit(0);
		

	}
	return 0;

}

结果显示:

parent write hello! 
parent write pipe! 
(sleep 210 numbers read from the pipe is hellopipe

代码分析:

read()函数的原型是

int read(int fd,void *buf,int count);

解释:

char buff[1024];
int fd1,i;
read(fd1,buff,sizeof(buff))
参数依次为:文件描述符,变量,读取长度

功能是“从文件说明符fd相关联的文件中读取count个字符,并把这些字符存储到buf所指的缓冲区回中。

返回值是操作成功时所读到的字节数,在文件结束时可能少于count个字答节;若返回值为-1则说明出错了,返回0则表示到达文件尾端。

2、命名管道

定义:

#include<sys/types.h>
#include<sys/stat.h>

int mkfifo(const char * pathname,mode_t mode);

参数:

pathname: FIFO文件名;
mode: 属性(见文件操作章节)
一旦创建一个FIFO就可以通过open打开他,一般的文件访问函数(close,read,write等)都可以用于FIFO。

3、信号通讯

4、共享内存

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2、进程通信 的相关文章

  • C51简介及Keil的使用

    前言 此文档主要是针对有一定C C 编程基础 并打算用Keil从事C51开发的开发人员 C51涉及的知识比较多 但是入门基本的开发 还是容易的 C51简介 1 C51概念 C51继承于C语言 主要运行于51内核的单片机平台 单片机 单片微型
  • 使用嵌入式linux完全手册光盘的arm-linux-gcc 遇到问题 自己编译

    Redhat9下重新生成交叉编译器gcc 3 4 5 glibc 2 3 6 看到论坛上有兄弟也遇到 arm linux gcc lib tls libc so 6 version GLIBC 2 4 not found required
  • 优化VMware提高虚拟机运行速度的技巧

    vmware虚拟机如何设置不当的话会造成运行速度慢 并影响主机运行 甚至会出现死机 一下是提高vmware虚拟机运行速度的几个技巧 希望我的博客对您有用 阿里云最高1888通用代金券 送给你 文章来自 http blog csdn net
  • AD采样出来的数值与实际值之间的关系

    当刚接触AD采样时 一直对于AD采集出来的数值与实际的值之间的关系有些模糊 现在闲暇下来打算记录一下 这里以采集量为电压量来记录 当采集温度 电流等模拟量时 都是通过一个电路把模拟量转化为一个电压量输入进AD采样引脚 就不一一叙述 AD采样
  • 树莓派体验3 - SSH登录树莓派

    如果没有HDMI转接线 显示器 USB转TTL串口线 那么可以通过网络SSH远程登录的方式访问树莓派 无显示器使用SSH访问 开启SSH服务 首先 通过镜像版本号确认一下SSH是否默认开启 树莓派官网的release note中说明 201
  • modbus总线协议(一)modbus rtu

    一 介绍 Modbus协议由Modicon公司开发出来 现在Modbus是工业领域全球最流行的协议 硬件支持RS 232 RS 422 RS 485和以太网设备 应用在PLC DCS 智能仪表等工控领域 图片来源于网络 二 modbus协议
  • iOS逆向工程之App脱壳

    本篇博客以微信为例 给微信脱壳 砸壳 在iOS逆向工程中是经常做的一件事情 因为从AppStore直接下载安装的App是加壳的 其实就是经过加密的 这个 砸壳 的过程就是一个解密的过程 未砸壳的App是无法在Class dump Hoppe
  • 嵌入式杂谈之中断向量表

    虽说接触了好久的单片机或者说嵌入式开发 不过对于有些概念还是比较模糊 因此此系列将会从一些零碎的小知识点出发 慢慢的遍历整张嵌入式开发的地图 这次先来看一下中断向量表 至于为什么会提到中断向量表 主要是因为我自己在学习嵌入式Linux开发的
  • main.c(31): warning: #223-D: function “uart_init“ declared implicitly

    Keil5编程之warning 223 D function xxx declared implicitly 1 函数没有头文件中进行声明 在头文件中添加声明 2 定义错误 字母大小可能不一致 仔细看一下出现问题的函数是否在声明和调用时使用
  • 按键的短按和长按检测

    方法一 常用的加延时函数 在中断服务函数中加一个比如10ms的延时函数 延时时间的长短取决于实际所用的按键特性 只要延时时间比抖动时间略大即可 原理很简单 加了延时就避开了抖动的这段时间 在延时之后判断引脚电平 如果为低电平就表示是按下 v
  • keil mdk代码提示与代码补全设置

    主要参考https blog csdn net w5862338 article details 50520423 结合自己的实际问题 一旦习惯了一些实用的功能 当进入到类似的环境中而没有熟悉的功能 会觉得很不方便 代码提示与补全就是这样实
  • LWIP在STM32上的移植

    本文做记录摘抄 加上自己的体会 文章标题 STM32使用LWIP实现DHCP客户端 http www cnblogs com dengxiaojun p 4379545 html 该文章介绍了几点 LWIP源码的内容 关键点 1 inclu
  • 解决Keil调试模式下无法设置断点的问题

    问题描述 使用Keil打开工程文件 进入调试模式后 只有main c文件里面可以设置断点 其余文件都不可以设置断点 可能的原因及解决方案 原因1 工程路径包含中文 解决方案1 更换为全英文路径 原因2 工程没有全部Rebuild 解决方案2
  • STM32 FLASH操作

    STM32 的闪存模块由 主存储器 信息块和闪存存储器接口寄存器等 3 部分组成 主存储器 该部分用来存放代码和数据常数 如 const 类型的数据 对于大容量产品 其被划分为 256 页 每页 2K 字节 注意 小容量和中容量产品则每页只
  • STM32CubeMX HAL库串口+DMA+IDLE空闲中断不定长度数据接收和发送

    本文开发环境 MCU型号 STM32F103ZET6 IDE环境 MDK 5 29 代码生成工具 STM32CubeMx 5 3 0 HAL库版本 STM32Cube FW F1 V1 8 0 STM32Cube MCU Package f
  • 物联锁项目失败原因分析

    一 背景 2022年3月份接手IM024物联锁项目救火 此项目主要用于医院共享轮椅 共享病床 此项目是从2021年初开始立项开发 投入了大量的人力物力 但是在2022年3月份时产品工作仍然不稳定 此项目基本上可以判定为一个失败的典型 为了吸
  • stm32 HAL库 Flash操作简介

    stm32 HAL库 Flash操作简介 目录 第一stm32 flash介绍 查看代码段 以判断代码长度 flash的基本操作规则 stm32 HAL库 Flash操作指南 stm32f1xx hal flash c stm32f1xx
  • FreeRTOS中断管理

    目录 说明 一 中断基础 1 1 中断理解 1 2 中断执行步骤 1 3 中断寄存器选择位 1 4 中断优先级分类 二 中断优先级分组设置 2 1 分类 2 2 特点 三 中断有关寄存器 3 1 SHPR1寄存器 3 2 SHPR2寄存器
  • Linux值得学习吗?打工人利用业务时间学习Linux需要多长时间?

    nbsp Linux值得学习吗 打工人利用业务时间学习Linux需要多长时间 在开始前我有一些资料 是我根据自己从业十年经验 熬夜搞了几个通宵 精心整理了一份 Linux的资料从专业入门到高级教程 工具包 点个关注 全部无偿共享给大家 在评
  • Java语言真的跌落神坛了吗?

    Java语言真的跌落神坛了吗 在开始前我有一些资料 是我根据自己从业十年经验 熬夜搞了几个通宵 精心整理了一份 Java的资料从专业入门到高级教程 工具包 点个关注 全部无偿共享给大家 在评论区回复 888 之后私信回复 888 即可拿走

随机推荐

  • 面试官:为什么data属性是一个函数而不是一个对象?

    一 实例和组件定义data的区别 vue实例的时候定义data属性既可以是一个对象 也可以是一个函数 const app new Vue el app 对象格式 data foo foo 函数格式 data return foo foo 组
  • 标签显示不出图片——图片路径问题

    引言 大家在进行开发的过程中 经常会有显示图片这个需求 但是却经常因为种种问题显示不了 接下来 我将详细叙述这个问题 希望对大家有所帮助 图片显示不出 一般有三个问题 一 图片所在路径错误 1 使用绝对路径 解决方法 右键查看图片的详细属性
  • js localStorage

    localStorage是H5提供的永久存储空间 一般最大可存储5M数据 并且支持跨域隔离 他的出现极大提高了前端开发的可能性 localStorage的使用很多人都知道setItem getItem removeItem 但他也可以直接以
  • 放弃apollo到自己研发,全局码表系统。

    背景 码表都见过 每个系统都有自己的码表 每个用户 2B 都有自己码表 这里不是说每个客户端自定义 apollo是配置中心 这和码表的功能不一样 码表更侧重数据库用int类型代替varchar类型 以节约存储空间 之前码表的使用 在后端用子
  • RKD知识蒸馏实战:使用CoatNet蒸馏ResNet

    文章目录 摘要 最终结论 数据准备 教师网络 步骤 导入需要的库 定义训练和验证函数 定义全局参数 图像预处理与增强 读取数据 设置模型和Loss 学生网络 步骤 导入需要的库 定义训练和验证函数 定义全局参数 图像预处理与增强 读取数据
  • 高防cdn和高防服务器有什么不一样?

    高防cdn 相信很多看过我们文章的小伙伴对cdn已经很了解了 cdn的原理很简单 就是构建在网络上的很多个节点 为网站作内容 分发 使用户就近获取所需资源 且分配的cdn节点都是高防节点 每个节点都有防御功能 还可以帮助用户隐藏真实ip 高
  • 记mac虚拟机parallels安装银河麒麟V10系统步骤及问题

    1 银河麒麟官网下载系统 银河麒麟操作系统 麒麟操作系统 中标麒麟 麒麟软件官方网站 选择桌面操作系统V10并申请试用 下载桌面操作系统AMD64版 2 parallels安装麒麟系统 1 新建 选择 安装windows或其他操作系统 没找
  • Eclipse导入项目左下角有感叹号/红叉

    Eclipse导入项目左下角有感叹号 红叉 左下角的红色感叹号 导致原因 解决办法 项目左下角红叉 导致原因 解决办法 END 左下角的红色感叹号 导致原因 build path 出现问题 里面有缺失或者无法找到的包 显示红色感叹号是因为j
  • 写一个python接口自动化测试框架

    安装依赖库 在开始编写Python接口自动化测试框架之前 需要安装一些必要的依赖库 您可以使用pip命令安装 pip install requests pip install pytest pip install pytest html p
  • (C++)逻辑运算符——与(&&)、或(

    1 逻辑或 OR 运算符 当两个条件中有一个或全部满足某个要求时 则表达式的值为真 条件 一个真或全为真 结果 则为真 备注 如果最左侧的表达式为真时 将不会判断下一个表达式 提高电脑运行效率 2 逻辑与 AND 运算符 当两个条件为真时
  • 邮件附件名乱码问题

    1 在创建邮件前添加 System setProperty mail mime splitlongparameters false 2 在创建MimeMessageHelper对象时添加 MimeMessageHelper messageH
  • 如何录制gif动态图片并在CSDN中插入动态图片

    我们在网上浏览别人的博客时 经常可以看到以gif动态图显示的程序效果演示和代码段 那么如何录制gif动态图片并在CSDN中插入动态图片呢 下面介绍一种简单的方法 了解之后 你也可以将其应用在自己的博客中 以动态图的方式展示程序运行结果 当我
  • redis集群架构详解

    一 集群架构搭建 1 配置 在一台机器上模拟多台机器搭建redis集群 一个集群代表一台物理机 集群1路径 usr local redis redis cluster cluster1 9001 redis conf usr local r
  • C# IQR算法检测异常点

    话不多说 上马 public List
  • Java Web入门之Ajax的用法详解(附代码和实战)

    创作不易 觉得有帮助或需要源码可以点赞关注收藏后评论区留言 文章目录 前言 一 Ajax与传统的Web应用模式的对比 二 Ajax使用的技术 三 XMLHttpRequest对象的具体使用 四 与服务器通信 发送请求与处理响应 五 Ajax
  • Java最全SSM框架教程-学习笔记

    这里写目录标题 Spring快速入门 Spring优势 Spring开发步骤 Spring配置文件 Spring配置数据源 Spring注解开发 SpringMVC SpringMVC概述 SpringMVC快速入门 SpringMVC注解
  • put_user()函数和get_usr()函数介绍

    1 使用的场景 1 内核地址空间和驱动地址空间是隔绝的 不能使用memcpy 函数 必须使用专门的拷贝函数 2 在拷贝大量数据时使用copy to user 和copy from user 函数 拷贝单个数据时 比如某个int型变量 则优先
  • Vue-Router笔记大全

    Vue Router笔记大全 一 路由的本质和分类 1 路由的本质 2 分类 二 后端路由 1 概念和本质 2 SPA Single Page Application 三 前端路由 1 概念和本质 四 实现简易的前端路由 未使用vue ro
  • React-router v6 在 Class 组件和非组件代码中的正确用法

    最近内部正在开发的 react 项目 react router 全线升级到了 v6 版本 v6 版本中很多 API 进行了重构变更 导致很多旧写法失效 下面记录一下 history 模块在 v6 中的用法 一 在封装的 request 等非
  • 2、进程通信

    进程通信 进程通信 1 进程建通信概述 1 目的 2 来源 3 进程间通讯方式包括 2 管道通讯 1 无名管道 2 命名管道 3 信号通讯 4 共享内存 进程通信 1 进程建通信概述 1 目的 为何需要进程间通信 1 数据传输 一个进程需要