Linux应用编程之共享内存实例

1共享内存实例

01

主要内容    

上一小节小哥跟大家介绍了一下共享内存的知识,今天主要是做一个实战的演示,从而更好的理解共享内存的原理和实际应用。

02

程序示例   

 1#include <stdlib.h>2#include <stdio.h>3#include <string.h>4#include <errno.h>5#include <unistd.h>6#include <sys/stat.h>7#include <sys/types.h>8#include <sys/ipc.h>9#include <sys/shm.h>
10
11
12int main(int argc,char **argv)
13{
14    int shmid;
15    char *Send_addr = NULL;
16    char *Recv_addr = NULL;
17
18    if(argc != 2)
19    {
20        printf("Param Number over!\n");
21        exit(1);
22    }
23
24
25    if((shmid=shmget(IPC_PRIVATE,1024,S_IRUSR|S_IWUSR))==-1)
26    {
27        printf("create share memory Fail!\n");
28        exit(1);
29    }
30
31
32    if(fork()) 
33    {
34        Send_addr = shmat(shmid,0,0);
35        memset(Send_addr ,'\0',1024);
36        printf("Send string:%s\n",argv[1]);
37        strncpy(Send_addr ,argv[1],strlen(argv[1]));
38        wait(NULL);
39        exit(0);
40    }
41    else     
42    {
43        sleep(1);// syn  
44        Recv_addr = shmat(shmid,0,0);
45        printf("Receive string: %s\n",Recv_addr);
46        exit(0);
47    }
48}

03

实验现象   

04

程序解读   

以上提供的共享内存实例比较简单,不过可以非常好的理解共享内存。首先使用shmget创建一块共享内存,然后通过fork命令创建一个子进程,其中父子进程都通过shmat完成用户空间与共享内存的映射,从而分别获得对应的指针Send_addr和Recv_addr。

父进程通过使用Send_addr内存指针,把程序命令行参数写入到内存中,而子进程通过Recv_addr内存指针进行访问获得父进程向共享内存中写入的参数"1024-4096"字符串。

然而使用fork创建进程返回后其父子进程执行是无序的,同时访问共享内存的非原子性,所以子进程通过使用sleep(1)延时来使得父子进程任务错开访问共享内存。

2最后

这里小哥就介绍了使用共享内存的一些知识点, 希望能够对你有帮助,今天就分享到这里,下期精彩见!

推荐阅读:
专辑|Linux文章汇总专辑|程序人生专辑|C语言我的知识小密圈
关注公众号,后台回复「1024」获取学习资料网盘链接。
欢迎点赞,关注,转发,在看,您的每一次鼓励,我都将铭记于心~
嵌入式Linux微信扫描二维码,关注我的公众号

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

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

相关文章

洛谷P1279 字串距离 (动态规划)

题目描述 设有字符串X&#xff0c;我们称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串&#xff0c;如字符串X为”abcbcd”&#xff0c;则字符串“abcb□cd”&#xff0c;“□a□bcbcd□”和“abcb□cd□”都是X的扩展串&#xff0c;这里“□”代表空格字符。 如…

Python3——函数

Python3——函数 目录 Python3——函数 定义函数 实参和形参 返回值 将函数存储在模块中 定义函数 关键字def告知Python要定义一个函数。 最后一行是调用此函数&#xff0c;此函数不带参数和返回值。 实参和形参 函数参数可以有一个或者多个&#xff0c;可以是简单数据…

ASP.NET MVC 整合 Spring.net(1)- Controller进容器

我们都知道Asp.net MVC自有一套执行机制。通过分析MVC的MvcHandler关键代码ProcessRequest protectedinternalvirtualvoidProcessRequest(HttpContextBase httpContext) { AddVersionHeader(httpContext); //Get the controller typestringcontrollerNam…

再读王垠的《编程的智慧》,有怎样的感想?

王垠老师的《编程的智慧》这篇文章已经读了最起码5遍了&#xff0c;最近的项目做完一个阶段&#xff0c;到了把他做干净的时候&#xff0c;也就是优化代码&#xff0c;全面整理的阶段&#xff0c;这个时候我又想起了这篇编程的智慧&#xff0c;有一些启发与大家分享。王垠老师的…

国外流行的五款免费在线图片编辑器评测

也许当你在度假的时候&#xff0c;不喜欢携带着你的笔记本电脑&#xff0c;但你在度假的时候一定会拍照。现在&#xff0c;你可以打理这些照片&#xff0c;甚至还可以在“网络咖啡屋”中进行一些高级的图像编辑。一些基于网络的照片编辑程序在去年逐渐兴起&#xff0c;大多是基…

void 型指针的高阶用法,你掌握了吗?

[导读] 要比较灵活的使用C语言实现一些高层级的框架时&#xff0c;需要掌握一些进阶编程技巧&#xff0c;这篇来谈谈void指针的一些妙用。测试环境采用 IAR for ARM 8.40.1推荐一首中文歌曲<<后来>>&#xff0c;英文翻唱<<life>>来自瑞典歌手Sofia Kal…

电子美图更新36张!

电子美图更新36张&#xff0c;下面请欣赏&#xff01;如果喜欢&#xff0c;请帮忙点“赞”和"在看"哦&#xff01;推荐阅读&#xff1a;专辑|Linux文章汇总专辑|程序人生专辑|C语言我的知识小密圈关注公众号&#xff0c;后台回复「1024」获取学习资料网盘链接。欢迎点…

C#多线程JOIN方法初探

[说明&#xff1a;刚接触多线程时&#xff0c;弄不明白Join()的作用&#xff0c;查阅了三本书&#xff0c;都不明不白。后来经过自己的一番试验&#xff0c;终于弄清了Join()的本质。大家看看我这种写法是否易懂&#xff0c;是否真的写出了Join()的本质&#xff0c;多提宝贵意见…

STM32F0单片机快速入门八 聊聊 Coolie DMA

1.苦力 DMA世上本没有路&#xff0c;走的人多了&#xff0c;便成了路。世上本没有 DMA&#xff0c;需要搬运的数据多了&#xff0c;便有了 DMA。大多数同学应该没有在项目中用过这个东西&#xff0c;因为一般情况下也真不需要这个东西。在早期的单片机中也不存在DMA模块。再加上…

Python学习之==第三方模块的安装、模块导入

一、模块&包 1、模块 模块实质上就是一个Python文件&#xff0c;它是用来组织代码的。意思就是把Python代码写在里面&#xff0c;文件名就是模块的名称。例如&#xff1a;random.py&#xff0c;random就是模块的名称。 2、包 包又叫pageage&#xff0c;本质就是一个文件夹&…

操作系统中抢占式和非抢占式内核的区别

编排 | strongerHuang微信公众号 | 嵌入式专栏操作系统分为抢占式内核和非抢占式内核&#xff0c;通常RTOS都是抢占式内核。下面就来讲讲抢占式内核和非抢占式内核的内容。非抢占式内核非抢占式内核要求每个任务&#xff08;线程&#xff09;都做一些事情来明确放弃对 CPU 的控…

Python3——简单的TCP实例

Python3网络编程——简单的TCP实例 服务器&#xff1a;创建套接字——绑定服务器地址——监听连接——接受连接——数据接收/发送 客户端&#xff1a;创建套接字——连接服务器地址——数据接收/发送 """ server.py encode()/decode() """ fro…

UDP协议 sendto 和 recvfrom 浅析与示例

图片/在思考的樱木花道UDP&#xff08;user datagram protocol&#xff09;用户数据报协议&#xff0c;属于传输层。UDP是面向非连接的协议&#xff0c;它不与对方建立连接&#xff0c;而是直接把数据报发给对方。UDP无需建立类如三次握手的连接&#xff0c;使得通信效率很高。…

劝你要看一些有门槛的机会

最近发了很多招聘信息&#xff0c;招聘的岗位算不错的&#xff0c;但是投简历的人不多。我想起来刚开始工作那几年&#xff0c;工资虽然很低&#xff0c;但是也不怎么想鞠躬投简历&#xff0c;毕竟那个时候把面子这个事情看的比什么都重要。自己觉得自己有才&#xff0c;不过后…

Python3——简单的UDP实例

Python3——简单的UDP实例 服务器&#xff1a;创建套接字——绑定套接字——数据接收/发送 客户端&#xff1a;创建套接字——数据接收/发送 """ server.py encode()/decode() """ from socket import * from time import ctimeHOST PORT 11…

怎么得到自增列的下一个会插入的id

代码 1declareTable_namevarchar(60) 2setTable_namePay_inputpay; 3Selectso.name Table_name, --表名字4sc.name Iden_Column_name, --自增字段名字5ident_current(so.name) curr_value, --自增字段当前值6ident_incr(so.name) incr_value,…

ESP32,使用gitee搭建 ESP-IDF 开发框架

ESP32便宜&#xff0c;开发方便&#xff0c;非常适合初学者用来学习&#xff0c;之前我自己写的开发环境可能不再适合&#xff0c;推荐下面这篇文章。关于如何搭建ESP32的开发环境&#xff0c;乐鑫官方给出了很详细的教程和文档&#xff0c;基本上跟着官方教程来操作&#xff0…

jQuery的ajax技术

编辑本博客 ajax异步的JavaScript和html load() 从服务器加载数据&#xff0c;并把返回的数据放入备选元素中。这里加载回来的数据可以只有一个p标签&#xff0c;无需head元素等 $("selector").load(url,data,callback) url&#xff1a;必选&#xff0c;规定加载的ur…

Linux设备树的传递以及kernel中对设备树的解析

当U-Boot将设备树加载到内存指定位置后&#xff0c;ARM内核的SoC以通用寄存器r2来传递dtb在内存中的地址。kernel获取到该地址后对dtb文件做进一步的处理。#设备树的传递当使用bootm加载kernel镜像时&#xff08;bootz是对bootm的一种封装以及功能扩展&#xff0c;实质一样&…

常用shell命令

要复制整个目录&#xff0c;请使用 cp 命令的 -r 选项。例如&#xff0c;如果有一个名为 mydir 的目录&#xff0c;其中包含 myfile 和 newfile&#xff0c;则可以将该目录复制到一个名为 mydir2 的新目录。mydir2 还将包含 myfile 和 newfile 的副本。请使用以下命令&#xff…