linux下通过共享内存在进程之间实现通信(system V)

【Linux操作系统】--System V的共享内存进程通信 System V起源 共享内存原理 共享内存应用原理 共享内存接口 创建共享内存shmget shmget测试 创建和删除代码 挂载接口shmat 去关联调用接口shmdt 第二个进程与共享内存挂载 两个进程进行通信 共享内存的特性 补充知识 【shmget的第二个参数size】 shmid每次运行的数量会增加问题 system V信号量(非重点) 阅读详情

参照书上的例程,实现在父子进程之间通过共享内存实现简单的通信。

 

#include<stdio.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/sem.h>
#include<string.h>

typedef int sem_t;
union semun
{
 int val;
 struct semid_ds *buf;
 unsigned short *array;
}arg;
sem_t CreateSem(key_t key,int value)
{
 union semun sem;
 sem_t semid;
 sem.val = value;
 

 semid = semget(key,1,IPC_CREAT|0666);
 if(-1 == semid)
 {
  perror("create semaphore error\n");
  return -1;
 } 
 semctl(semid,0,SETVAL,sem);
 return semid;
}
int Sem_P(sem_t semid)
{
 struct sembuf sops = { 0,+1,IPC_NOWAIT};
 return (semop(semid,&sops,1));
}
int Sem_V(sem_t semid)
{
 struct sembuf sops = { 0,-1,IPC_NOWAIT};
 return (semop(semid,&sops,1));
}
void DestorySem(sem_t semid)
{
 union semun sem;
 sem.val = 0;
 
 semctl(semid,0,IPC_RMID,sem);
}

 


static char msg[] = "hi,shared memeory\n";
int main()
{
 key_t key;
 int semid,shmid;
 char i,*shms,*shmc;
 struct semid_ds buf;
 int value = 0;
 char buff[80];
 pid_t p;

 key = ftok("/ipc/sem",'a');   /*生成键值*/
 shmid = shmget(key,1024,IPC_CREAT|0604);/*获得共享内存,大小为1024k*/

 semid = CreateSem(key,0);/*创建信号量*/
 

 p = fork(); /*创建子进程*/
 if(p > 0)   /*(父进程*/
 {
   shms = (char*)shmat(shmid,0,0);/*挂接共享内存,shms得到实际可用的地址*/
   memcpy(shms,msg,strlen(msg)+1);/*复制内容*/
   sleep(10);/*等待时间,子进程将数据读出*/
 
   Sem_P(semid);/*信号量semid的value加1*/
   shmdt(shms);/*摘除共享内存*/
   
   DestorySem(semid);/*销毁信号量*/
   
 }
 else if(p == 0)/*子进程*/
 {
  shmc = (char*)shmat(shmid,0,0);/*挂接共享内存*/
  Sem_V(semid);/*信号量semid的value减1*,与Sem_P()配合使用*/
  printf("shared memory value is :%s",shmc);/*读出数据*/
  shmdt(shmc);/*摘除共享内存*/
 }
 return 0;
 
}

 

操作系统实验二进程通信 自己设计一个程序,该程序创建一个子进程,使父子进程合作,协调地完成某一功能。要求在该程序中还要使用进程的睡眠、进程图象改换、父进程等待子进程终止、信号的设置与传送(包括信号处理程序)、子进程的终止等有关进程的系统调用。 立即下载

相关推荐

linux通过共享内存实现进程之间的通信

自己做的一个ppt通过共享内存的方式实现进程间的通信

通过共享内存进行进程间通信

<br />共享内存的工作方式<br />顾名思义,共享内存让一段内存可供多个进程访问。用特殊的系统调用(即对 UNIX 内核的请求)分配和释放内存并设置权限;通过一般的读写操作读写内存段中的数据。 <br />共享内存并不是从某一进程拥有的内存中划分出来的;进程的内存总是私有的。共享内存是从系统的空闲内存池中分配的,希望访问它的每个进程连接它。这个连接过程称为映射,它给共享内存段分配每个进程的地址空间中的本地地址。<br /> 假设在同一系统上有两个进程 A 和 B 正在运行(见 图 1),它们可以通过共

liangkaiming的专栏 6788

父子进程之间的共享内存

父子进程之间的共享内存,父子之间的互相通信。

08利用共享内存实现父子进程间通信,子进程写入“hello father!”,父进程将子进程写入的内容读出后打印到屏幕,同时打印子进程的ID号(最后一次测试)

【代码】08利用共享内存实现父子进程间通信,子进程写入“hello father!”,父进程将子进程写入的内容读出后打印到屏幕,同时打印子进程的ID号(最后一次测试)

weixin_58621185的博客 381

H3C交换机Console口连接全攻略:从接线到PuTTY配置(附常见问题排查)

本文详细介绍了H3C交换机Console口的连接与配置方法,包括硬件线缆选择、驱动安装、PuTTY参数设置及常见问题排查。特别针对Console转USB线缆的兼容性和驱动安装难点提供实用建议,帮助网络工程师快速掌握串联调试技巧,解决连接中的黑屏、乱码等典型问题。

weixin_42549451的博客 674

UE 顶点动画工具 (VAT)

导入模型需要勾选全精度UV。

iesoxj的博客 1642

进程间通信---system V 共享内存

文章目录1. 认识共享内存1.1 概念1.2 共享内存示意图2. 共享内存函数2.1.ftok2.1.1 功能2.1.2 声明2.1.3 实例2.2. shmget2.2.1 功能2.2.2 声明2.2.3 实例2.3 shmctl2.3.1 功能2.3.2 声明2.3.3 实例2.4 shmat函数2.4.1 功能2.4.2 声明2.5 shmdt函数2.5.1 功能2.5.2 声明2.5.3 实例3. 进程间通信3.1 common.h(头文件)3.2 server.c(服务器)3.3 client.c

折木的博客 588

史上最全的Logisim存储系统实验教程(基于华中科技大学计算机组成原理实验)内赋源码下载

本博客是最全的最好的解释的华中科技大学计算机组成实验存储系统实验,本博客给出了电路实现,也给出了使用电路的原因有利于新手学习十分详细。并且内赋源码下载。

qq_62325622的博客 2万+

共享内存实现父子进程通信

父进程在内核空间创建了一个共享内存,通过fork函数,父子进程通过fork函数继承了shmid,所以父子进程可以对内核中同一个对象操作,刚开始父进程不断往对象里写,然后开始发信号SIGUSR1给子进程,让子进程读。对于子进程来说,刚开始睡眠,等待父进程写,然后被内核唤醒,读共享内存。此时父进程开始睡眠,当子进程读完后,将父进程唤醒,父进程唤醒后继续写……一直循环(父子进程都通过shmat映射到自己...

qq_43849025的博客 2605

Xilinx DMA IP核心配置与实战解析

本文介绍了Xilinx DMA IP核在直接寄存器模式下的配置与工作流程。DMA通过AXI4-Lite接口接收指令,实现内存与数据流之间的高速传输,无需CPU介入。文章详细说明了开发环境配置、IP参数设置(包括地址位宽、数据宽度等关键参数)以及寄存器操作流程。通过仿真分析,展示了读操作中AXI4接口的突发传输机制,包括地址、长度和突发大小的配置。文中还提供了寄存器地址映射表、信号定义等关键信息,为DMA IP核的应用开发提供了实用参考。

weixin_37688766的博客 884

Materials Studio实战技巧(八)——利用片段库高效构建有机金属配合物

本文详细介绍了在Materials Studio中利用Fragment Browser(片段浏览器)高效构建有机金属配合物的实战技巧。通过调用预置的Metal Templates和Ligands库,用户可以快速搭建如茂金属催化剂等复杂分子骨架,并利用对称性操作精确控制Meso与Rac构型。文章还涵盖了自定义片段库的创建与使用,能显著提升建模效率,适用于计算化学与材料模拟领域的研究者。

wine的专栏 936

PHP与Linux进程间的通信

进程间通信预计是公司考察应届毕业生的必考点(嵌入式行业)。当然非常多公司考的是算法。 不查阅资料,我脑子里能想到的 [1] 管道, (有名。无名) [2] 父子进程 [3] System V (消息队列, 共享内存,信号量) [4] Socket(本...

weixin_30855099的博客 67

Revit二次开发之双事件:空闲事件与DocumentChanged事件

对以下文章所展示的代码进行了修改,当前展示的代码可直接复制使用。 由于本人初学,下列语言为个人理解,如有错误请指正。   《引用1》中: 使用模态对话框,或者尽量保证事件在ExternalCommand的Execute函数或者ExternalApplication的OnStartup函数里面注册。 如果一定要使用非模态对话框,那么请使用ExternalEvent事件的Raise函数,强迫...

一个Revit二次开发的实习生 6147

Unix/Linux的System V、BSD、Posix概念

UNIX BSD有:管道(pipe)、命名管道(named pipe)软中断信号(signal) UNIX system V有:消息(message)、共享存储区(shared memory)和信号量(semaphore)等. 转载链接: UNIX两种风格 SystemV的鼻祖正是1969年AT&T开发的Unix,随着1993年Novell收购AT&T后开放了Unix的商标,SystemV的风格也逐渐成为Unix厂商的标准。 BSD的鼻祖是加州大学伯克利分校在1975年开发的BSDUnix,

10000day 910

【DaVinci Developer专题】-23-IDT高阶应用:结构体类型的数组

共8页 目录 1 创建一个Record IDT 2 创建一个Array IDT 3 创建一个S/R Port Interface 4 创建一个Constant 5 导入CFG生成代码的总结 6 结尾 <--返回「实战篇」博文-总目录--> <--返回「Autosar从入门到精通-实战篇」专栏主页--> 关键字: 缩略语/术语 含义 DEV DaVinci Developer .

「汽车电子助手」的博客 1669

uniapp [安卓苹果App端] - 实现微信支付功能+拉起微信付款支付后返回本app页面,详解uniApp如何唤起本机微信app并跳转到支付页面全流程及示例源码(uniapp实现微信支付,可打包)

uni-app项目在APP端使用微信支付功能,uniapp前端实现微信支付,uniapp开发安卓App对接微信支付,uniapp苹果ios唤起微信支付,uniapp调用微信支付uniapp开发app-调用微信支付,uniapp开发安卓苹果app如何接入微信支付,前后端应该怎么做,UniApp中实现微信支付功能,支付报错,调起失败没响应,uniapp苹果微信支付唤起实现,app唤起微信支付,拉起微信支付,uniapp中唤醒微信进行支付并返回app,uniApp调起微信支付失败报错,全网最详细的uniapp微信

🏆 前端领域优质创作者 1万+

【Linux进程间通信】深入探索:Linux下的命名管道与System V共享内存

在Linux操作系统中,进程间通信(IPC)是一个至关重要的概念,它允许不同的进程之间进行数据交换和同步。随着现代操作系统的日益复杂,进程间通信的重要性也日益凸显。在众多IPC机制中,命名管道和System V共享内存无疑是两种最为常见且强大的工具

EterNity_TiMe_的计算机学习之路 3117

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【Linux】进程间通信——System V共享内存

System V是一种在Linux系统中用于进程间通信(IPC)的机制。它提供了几种不同的通信方式,包括共享内存、消息队列和信号量。System V共享内存是一种高效的进程间通信(IPC)机制,它允许多个进程共享一块物理内存区域,从而避免了数据的复制,显著提高了数据传输速率。

Renswc的博客 2485

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【Linux篇章】进程通信黑科技:System V 共享内存,开启进程间通信的星际数据通道!

嘿!System V 共享内存宛如进程间通信的超级魔法通道。它打破常规,让进程直连同一块内存,数据传输快如闪电。创建、连接、读写、分离、删除,一套流程行云流水。虽有同步和管理小挑战,但丝毫不掩其高效协作的强大魅力!

羑悻的博客. 5142

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Linux之进程间通信(system V 共享内存)

进程间通信的本质就是让不同的进程看到同一个资源。而前面我们讲到了进程通信的最基础,最传统的方法——管道。我们知道了,无论是匿名管道还是命名管道,它们让不同进程看到同样的资源的方法,就是通过访问同样的文件来看到同样的资源。进程间是相互独立的,因此进程的各种数据是存储在物理内存的不同区域的。那么,如果两个不同的进程能够访问到同一块内存空间,是不是就相当于看到了同样的资源。那么有没有这样的方法呢?答案是肯定的,system V中的共享内存就是这样的一种进程间通信的方法。

zdlynj的博客 2151

System V共享内存详解:在Linux上实现内存共享的最佳实践

linux(system V)共享内存

A.的博客 2182

【Linux】进程间通信3——system V共享内存

管道通信本质是基于文件的,也就是说操作系统并没有为此做过多的设计工作,但是不管怎么样,它们的本质都是一样的,都是在想尽办法让不同的进程看到同一份由操作系统提供的资源。其中,,虽然system V信号量和通信好像没有直接关系,但属于通信范畴。

2301_80224556的博客 1694

【Linux笔记】进程间通信——system v 共享内存

共享内存是Linux系统中进程间通信(IPC)的一种方式,允许多个进程直接访问同一块物理内存区域。它的核心特点是零拷贝——数据直接在内存中共享,无需通过内核缓冲区中转,因此成为速度最快的IPC机制。共享内存是system v的一种标准,Linux内核支持这种标准,专门设计了这个模块。两个进程访问同一块物理内存,如上图共享内存通过页表映射到两个进程的地址空间,两个进程就可以看到同一块资源,进而实现进程间的通信。

GGDxianv的博客 1106

System-V共享内存和基于管道通信实现的进程池

进程间通信

小青菜的博客 2234

Linux通信:基于System V共享内存方式实现进程间通信

一、基于共享内存通信方式原理 二、共享内存优缺点 2.1 共享内存优缺点 2.2 基于文件通信 vs 共享内存通信 三、相关函数调用接口 2.1 创建共享内存(shmget) 2.1.1 key 2.1.2 size 2.1.3 shmflg 2.1.4 返回值 2.2 共享内存段挂接到进程地址空间(shmat) 2.3 将共享内存段与当前进程脱离(shmdt) 2.4 用于控制共享内存(删除)(shmctl) 四、基于System V共享内存实现进程间通信

Zhenyu_Coder的博客 2335
上一篇: linux下怎么实现在进程中得到其他进程的信息
下一篇: linux下彻底删除软件及配置文件
five_kill
博客等级 码龄12年 0粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值