linux 访问共享内存,Linux下的共享内存(03)---通过指针访问共享内存中的数据...

环境:Vmware Workstation;CentOS-6.4-x86_64

说明:

1、将共享内存挂载至进程:void  *shmat(int  shmid, const void *shmaddr,int shmflg);

参数shmid是要附加的共享内存区标示符。

总是把参数shmaddr设为0。

参数shmflg可以为SHM_RDONLY,这意味着附加段是只读的。

shmat成功返回被附加了段的地址,失败返回-1,并设置errno。

2、将附在共享内存上的进程分离:int shmdt(const void *shmaddr);

参数必须是挂在函数返回的指针。这个地址必须是shmat返回的。

图解说明:

011f005aa6a9cd4684ba29cbd5279e16.png

程序:

实现一个进程修改共享内存中的数据,另一个进程读取共享内存中的数据。

步骤:

1、创建并编写makefile文件:

.SUFFIXES:.c .o

CC=gcc

SRCS1=main1.c

OBJS1=$(SRCS1:.c=.o)

EXEC1=main1

SRCS2=main2.c

OBJS2=$(SRCS2:.c=.o)

EXEC2=main2

start: $(OBJS1) $(OBJS2)

$(CC) -o $(EXEC1) $(OBJS1)

$(CC) -o $(EXEC2) $(OBJS2)

@echo "--------------------------OK------------------------"

.c.o:

$(CC) -Wall -o $@ -c $<

clean:

rm -rf $(OBJS1) $(EXEC1)

rm -rf $(OBJS2) $(EXEC2)

2、通过前面的一个笔记创建一块共享内存。

[negivup@negivup mycode]$ ipcs -m

------ Shared Memory Segments --------

key shmid owner perms bytes nattch status

0x00000000 229381 negivup 666 1024 0

3、创建并编写源文件main1.c:

#include #include #include #include int main(int argc, char *args[])

{

// 将进程依附到共享内存上

// 第一个参数是共享内存的shmid,第二个参数和第三个参数都是0

// 函数的返回值是一个指向共享内存的地址,指针类型是void*

void *p_temp = shmat(229381, 0, 0);

// 转换指针的类型根据要写入共享内存的数据类型而定

char *p = (char*)p_temp;

// 将字符串拷贝至共享区

strcpy(p, "hello\n");

// 将进程从共享内存上剥离,传递的参数是shmat返回的地址

shmdt(p);

return 0;

}4、创建并编写源文件main2.c:

#include #include #include #include int main(int argc, char *args[])

{

// 将进程依附到共享内存上

// 第一个参数是共享内存的shmid,第二个参数和第三个参数都是0

// 函数的返回值是一个指向共享内存的地址,指针类型是void*

void *p_temp = shmat(229381, 0, 0);

// 转换指针的类型根据要读取的共享内存的数据类型而定

char *p = (char*)p_temp;

// 将读取的内容显示到屏幕

printf("%s", p);

// 将进程从共享内存上剥离,传递的参数是shmat返回的地址

shmdt(p);

return 0;

}

5、编译并执行程序:

[negivup@negivup mycode]$ make

gcc -Wall -o main1.o -c main1.c

gcc -Wall -o main2.o -c main2.c

gcc -o main1 main1.o

gcc -o main2 main2.o

--------------------------OK------------------------

[negivup@negivup mycode]$ main1 main1是向共享内存中写入数据

[negivup@negivup mycode]$ main2 main2是从共享内存中读取数据

hello

PS:根据传智播客视频学习整理得出。

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

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

相关文章

Java中锁的使用和实现

首先&#xff0c;我们要了解一个概念&#xff0c;JAVA中的锁到底是什么呢&#xff1f; 锁是用来控制多个线程访问共享资源的方式&#xff0c;一般来说&#xff0c;一个锁能够防止多个线程同时访问共享资源。 Lock接口 在Java SE 5之后&#xff0c;并发包中新增了Lock接口&am…

【OpenCV 例程200篇】225. 特征提取之傅里叶描述子

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】225. 特征提取之傅里叶描述子 目标特征的基本概念 通过图像分割获得多个区域&#xff0c;得到区域内的像素集合或区域边界像素集合。我们把感兴趣的人或物称为目标&#xff0c;目标所处的区域就是目…

【OpenCV 例程300篇】238. OpenCV 中的 Harris 角点检测

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】238. OpenCV 中的 Harris 角点检测 角是直线方向的快速变化。角点通常被定义为两条边的交点&#xff0c;或者说角点的邻域应该具有两个不同区域的不同方向的边界。 角是高度有效的特征。角点检测&…

基础线性规划实现(matlab,lingo)

目录 一、本次所需解的问题 二、matlab解题 1&#xff09;语法 2&#xff09;数学思维 3&#xff09;matlab解题 运行结果&#xff1a; 三、lingo解题 lingo解题如下&#xff1a; 运行结果&#xff1a; 最后&#xff1a; 一、本次所需解的问题 需解出下面该线性规划问…

cwntos linux kde桌面,Centos如何安装KDE的桌面

其实KDE其实在初次安装系统的时候就可以选择&#xff0c;我下面是进入系统后的安装方法&#xff1a;第一步&#xff1a;检查KDE首先查看自己是否安装了KDE# yum grouplist在grouplist的输出结果中的“Installed Groups:”部分中&#xff0c;如果你能找到“X Window System”和“…

【OpenCV 例程 300篇】239. Harris 角点检测之精确定位(cornerSubPix)

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】239. Harris 角点检测之精确定位&#xff08;cornerSubPix&#xff09; 角是直线方向的快速变化。角点通常被定义为两条边的交点&#xff0c;或者说角点的邻域应该具有两个不同区域的不同方向的边界…

基础线性规划实现---python

目录 一、问题 何为线性规划问题&#xff1a; 二、python进行求解 1.通过观察matlab解线性规划步骤进行求解 2.python求解步骤 1&#xff09;求解用到的模块&#xff08;scipy 和 numpy&#xff09;&#xff1a; 2&#xff09;对 max z2x13x2-5x3 该问题确定c如下&…

【OpenCV 例程 300篇】240. OpenCV 中的 Shi-Tomas 角点检测

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】240. OpenCV 中的 Shi-Tomas 角点检测 角是直线方向的快速变化。角点通常被定义为两条边的交点&#xff0c;或者说角点的邻域应该具有两个不同区域的不同方向的边界。 角是高度有效的特征。角点检测…

多元统计分析1

第一章 多元正态分布 文章目录 1.1 多元分布的基本概念 1.1.1 随机向量 1.1.2 分布函数与密度函数 联合分布函数&#xff1a; 联合密度函数&#xff1a; 条件密度函数&#xff1a; 分量的独立性&#xff1a; 1.1.3 随机向量的数字特征 1.随机向量的均值 2、随机…

Java并发容器和框架

ConcurrentHashMap 我们为什么要使用 ConcurrentHashMap呢&#xff1f; 原因有三&#xff1a; 并发编程中HashMap会导致死循环&#xff1b;HashTable效率又非常低&#xff1b;ConcurrentHashMap的锁分段技术可有效提升并发访问率。在并发编程使用HashMap会导致死循环。 在多线…

【OpenCV 例程 300篇】241. 尺度不变特征变换(SIFT)

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】241. 尺度不变特征变换&#xff08;SIFT&#xff09; 6.4.1 简介 尺度不变特征转换算法&#xff08;Scale-invariant feature transform&#xff0c;SIFT&#xff09;是图像处理中经典的局部特征描…

整数线性规划实现(matlab分枝界定法)

文章目录 一、本次问题 1.利用第一天所学知识求解&#xff1a; 2.本题理解&#xff1a; &#xff08;1&#xff09;分支界定法 背景&#xff1a; 基本理论&#xff08;解题步骤&#xff09;&#xff1a; 求解实现1&#xff1a; 1.第一步 2.第二步 3.第三步 4.第四步…

linux opencv gtk 没窗口,OpenCV GTK+2.x error

可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效&#xff0c;请关闭广告屏蔽插件后再试):问题:I had installed OpenCV following these steps ().After trying to compile one examples,i got this error :OpenCV Error: Unspecified error (The function …

硬盘分区

我们买回一台全新的笔记本的时候&#xff0c;我们会发现里面只有一个硬盘&#xff0c;这个时候为了满足我们的需求我们往往要对硬盘进行分区&#xff0c;那麽如何正确的对硬盘进行分区的呢&#xff1f; 下面教大家如何正确的对电脑硬盘进行分区操作。 操作方法 1、在桌面上找…

python入门:Anaconda和Jupyter notebook的安装与使用

文章目录 一、安装和使用Anaconda 1、anaconda是什么&#xff1f; 2、为什么需要安装anaconda&#xff1f; 3、如何安装anaconda&#xff1f; 通过官网下载页面 开源软件下载 安装步骤&#xff1a; 4、jupyter汉化 5、如何管理包&#xff1f; 1.列出已安装的包 2.安装…

非线性规划(1)

目录 一、非线性规划的定义 二、非线性规划的模型 三、非线性规划函数 四、线性不等式约束 五、线性不等式和等式约束 六、带有非线性约束的求最值 七、非线性约束 总结&#xff1a; 一、非线性规划的定义 前面我们学了线性规划&#xff0c;整数规划&#xff0c;我们可…

响应式布局Demo

顾名思义&#xff0c;响应式布局就是为适应不同终端而形成的一种技术。我总结了一个简单的例子帮助大家了解和学习响应式布局。 实现响应式布局的几种方式&#xff1a;媒体查询、JS、流体布局、弹性布局… 常用的meta标签 <meta content"widthdevice-width,initial-…

整数线性规划实现(lingo,python分枝界定法)

本文章为上篇建模学习打卡第二天的续 文章目录 一、本次问题 二、本题理解 三、问题求解 1.lingo实现 &#xff08;1&#xff09;先抛除整数约束条件对问题求解 &#xff08;2&#xff09;加入整数约束条件求解 2.python实现求解 &#xff08;1&#xff09;先抛除整数约…

Atmel跑Linux的arm芯片,Linux已被移植到Atmel的ATmega微控制器

Ubuntu Linux发行版已经被移植到最便宜、最便携的平台中&#xff1a;一个Atmel的ATmega微控制器。拥有一个20MHz的8位AVR处理器&#xff0c;128KB的闪存和整块16KB的SRAM&#xff0c;ATmega1284P并不是建立微型计算机最合乎逻辑的选择。它是在Arduino原型平台中找到的同样基础的…

Android Studio 详细安装教程

在我们的日常 Android 开发中&#xff0c;一个好的开发工具是必不可少的------Android Studio&#xff0c;是一个最重要的开发工具。 下面我将详细介绍Android Studio的下载安装。 一、安装环境及下载资源 1.1 安装环境 电脑系统 : Windows 10 JDK 版本 : 1.8 Android Stud…