Linux进程间通信之POSIX共享内存

C/C++ Linux 共享内存(share memory)进程间通信实战:从System V到POSIX API的对比与选型【代码解析】 本文深入探讨了C/C++在Linux环境下使用共享内存(share memory)进行进程间通信的实战技巧,对比分析了System V与POSIX API的优缺点,并提供了详细的代码示例和性能优化建议。通过实际案例展示如何在高性能日志系统和跨语言通信中应用共享内存技术,帮助开发者选择最适合的IPC方案。 阅读详情

共享内存是最高效的IPC机制,因为它不涉及进程之间的任何数据传输。这种高效率带来的问题是,我们必须用其他辅助手段来同步进程对共享内存的访问,否则会产生竞态条件。因此,共享内存通常和其他进程间通信方式一起使用。
Linux下有三种共享内存的IPC技术:System V共享内存、共享文件映射(mmap)、POSIX共享内存。
我们在这里只介绍POSIX共享内存。

要使用POSIX共享内存对象需要完成下列任务。

  1. 使用shm_open()函数打开一个与指定的名字对应的对象。shm_open()函数与open()系统调用类似,它会创建一个新的共享对象或打开一个既有对象。作为函数结果,shm_open()会返回一个引用该对象的文件描述符。
  2. 将上一步中获得的文件描述符传入mmap()调用并在其flags参数中指定MAP_SHARED。这会将共享内存对象映射进进程的虚拟地址空间。与mmap()的其他用法一样,一旦映射了对象之后就能够关闭该文件描述符而不会影响到这个映射。

创建共享内存对象

shm_open()函数创建和打开一个新的共享内存对象或打开一个既有对象。传入shm_open()的参数与传入open()的参数类似。

#include<fcntl.h>
#include<sys/stat.h>
#include<sys/mman.h>

int shm_open(const char *name,int oflag,mode_t mode);

name参数标识出了待创建或待打开的共享内存对象。oflag参数是一个改变调用行为的位掩码。
oflag参数的位值

标记描述
O_CREAT对象不存在时创建对象
O_EXCL与O_CREAT互斥地创建对象
O_RDONLY打开只读访问
O_RDWR打开读写访问
O_TRUNC将对象长度截断为零

oflag参数的用途之一是确定是打开一个既有的共享内存对象还是创建并打开一个新对象。同时指定O_EXCL和O_CREAT能够确保调用者是对象的创建者,如果对象已经存在,那么就返回一个错误(EEXIST)。
oflag参数还表明了调用进程在共享内存对象上的访问模式,其取值为O_RDONLY或O_RDWR。

在一个新共享内存对象被创建时,其所有权和组所有权将根据调用shm_open()的进程的有效用户和组ID来设定,对象权限将会根据mode参数中设置的掩码值来设定。
与open()系统调用一样,mode中的权限掩码将会根据进程的umask来取值。与open()不同的是,在调用shm_open()时总是需要mode参数,在不创建新对象时需要将这个参数值指定为0。
shm_open()返回的文件描述符会设置close-on-exec标记,因此当程序执行了一个exec()时文件描述符会被自动关闭。
一个新共享内存对象被创建时其初始长度会被设置为0。这意味着创建完一个新共享内存对象之后通常在调用mmap()之前需要调用ftruncate()来设置对象的大小。在调用完mmap()之后可能还需要使用ftruncate()来根据需求扩大或收缩共享内存对象。
在扩展一个共享内存对象时,新增加的字节会自动被初始化为0。


使用共享内存

使用步骤:
1. 调用shm_open()函数创建或打开一个共享内存对象。
2. 调用ftruncate()调整对象大小。
3. 调用mmap()函数,将内存映射到相应的进程虚拟内存中。
mmap()系统调用在调用进程的虚拟地址空间中创建一个新映射。

#include<sys/mman.h>

void *mmap(void *addr,size_t length,int prot,int flags,int fd,off_t offset);

addr参数指定了映射被置放的虚拟地址。如果将addr指定为NULL,那么内核会为映射选择一个合适的地址。这是创建映射的首选做法。或者在addr中指定一个非NULL值时,内核会在选择将映射放置在何处时将这个参数值作为一个提示信息来处理。在实践中,内核至少会将指定的地址舍入到最近的一个分页边界处。
length参数指定了映射的字节数。
prot参数是一个位掩码,其取值见下表:

值描述
PROT_NONE区域无法访问
PROT_READ区域内容可读取
PROT_WRITE区域内容可修改
PROT_EXEC区域内容可执行

flags参数是一个控制映射操作各个方面的选项的位掩码。这里我们要设置为MAP_SHARED。
fd参数我们传入shm_open返回的描述符。
offset参数代表偏移量,设置为0代表从映射文件的开头开始映射。

代码示例

下面两个程序演示了如何使用一个共享内存对象将数据从一个进程传输到另一个进程中。
第一个程序将数据写入到共享内存中,第二个程序将数据从共享内存中读出。
使用gcc编译时,末尾加上 -lrt。

1.

/*************************************************************************
    > File Name: 1.c
    > Author:fengxin 
    > Mail:903087053@qq.com 
    > Created Time: 2017年08月02日 星期三 17时49分03秒
 ************************************************************************/

#include<stdio.h>
#include<string.h>
#include<fcntl.h>
#include<sys/mman.h>
#include<sys/stat.h>
#include <unistd.h>

int main()
{
    int fd;
    char *addr;
    fd=shm_open("test",O_RDWR|O_CREAT,0777);   //创建共享内存对象
    if(fd<0)
    {
        printf("shm_open error\n");
    }

    char string[20]="Hello world";
    if(ftruncate(fd,strlen(string))==-1)    //改变对象大小
    {
        printf("ftruncate error\n");
    }

    addr=mmap(NULL,strlen(string),PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);  //内存映射
    if(addr==MAP_FAILED)
    {
        printf("mmap error\n");
    }

    memcpy(addr,string,strlen(string));  //拷贝字符串到共享内存中

    close(fd);

    return 0;


}

2.

/*************************************************************************
    > File Name: 1.c
    > Author:fengxin 
    > Mail:903087053@qq.com 
    > Created Time: 2017年08月02日 星期三 17时49分03秒
 ************************************************************************/

#include<stdio.h>
#include<string.h>
#include<fcntl.h>
#include<sys/mman.h>
#include<sys/stat.h>
#include<unistd.h>

int main()
{
    int fd;
    char *addr;
    struct stat sb;
    fd=shm_open("test",O_RDWR,0);   //创建共享内存对象
    if(fd<0)
    {
        printf("shm_open error\n");
    }


    if(fstat(fd,&sb)==-1)
    {
        printf("fstat error\n");
    }

    addr=mmap(NULL,sb.st_size,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);  //内存映射
    if(addr==MAP_FAILED)
    {
        printf("mmap error\n");
    }

    write(STDOUT_FILENO,addr,sb.st_size);  //拷贝字符串到共享内存中

    close(fd);

    return 0;
}
FLAC3D数值三轴测试 本文介绍了使用FLAC3D进行数值三轴测试的命令流程。通过建立圆柱体模型,设置Mohr-Coulomb本构模型及材料参数,施加边界条件和荷载,并定义Fish函数监测应变和应力。命令包括模型创建、网格划分、材料属性定义、边界约束、荷载施加以及结果监测等步骤。该流程可用于模拟岩土材料在三轴条件下的力学响应,为数值分析提供参考。完整代码可从指定链接下载获取。 阅读详情

相关推荐

从零搭建ECG心电图仪:模拟前端电路设计与噪声对抗实战

在电子工程和生物医学信号处理领域,微弱信号的采集与放大是核心挑战。其基本原理在于利用高精度模拟电路,从强大的环境噪声中提取出有用的差分信号。这项技术的核心价值在于将理论上的传感器信号转化为稳定、可靠的可用数据,是连接物理世界与数字系统的关键桥梁。在医疗监护、工业传感和科学测量等场景中,高性能的模拟前端设计直接决定了整个系统的精度与可靠性。本文聚焦于生物电信号采集这一具体应用,深入探讨如何运用差分放大器、低通滤波器和陷波滤波器等经典模块,构建一个能够有效对抗工频干扰和接触噪声的实用电路,最终实现从人体体表清晰

weixin_30616969的博客 458

linux进程间通信:POSIX 共享内存

直接学习过sysemV 的共享内存的实现及使用原理,参考[] POSIX 同样提供共享内存的接口,基本原理和system V的共享内存是一样的。 通信原理 多个进程共享物理内存的同一块区域(通常称之为“段”:segment) 抛弃了内核态消息转存处理的过程,让两个进程直接通过一块内存进行通信 我们普通的像PIPE,FIFO,消息队列等的通信方式如下图: 这种方式的通信不论读写,都需要内核态(...

天行健,地势坤 1366

PT静态时序分析实战:从基础命令到高级报告解析

本文详细介绍了PT(PrimeTime)静态时序分析(STA)的实战技巧,从基础命令如pt_shell和report_timing的使用,到高级报告解析与问题排查。通过丰富的实例和脚本示例,帮助工程师快速掌握时序分析的核心技能,提升芯片设计验证效率。

weixin_29289821的博客 954

Linux进程通信之POSIX共享内存

前面已经讨论过Linux下个各种进程间的通信方式:管道,FIFO,消息队列,他们的共同特点就是通过内核来进行通信(假设POSIX消息队列也是在内核中实现的,因为POSIX标准并没有限定它的实现方式)。向管道,FIFO,消息队列写入数据需要把数据从进程复制到内核,从这些IPC读取数据的时候又需要把数据从内核复制到进程。所以这种IPC方式往往需要2次在进程和内核之间进行数据的复制,即进程间的通信必须借...

John Will的博客 382

2025小红书跳转卡片实战指南:从零搭建独立后台与自动化发卡系统

本文提供了一份2025年小红书跳转卡片的实战搭建指南,详细解析了独立后台系统的核心架构与自动化发卡流程。文章从零开始,手把手教你使用Node.js、Vue.js等技术栈构建包含后台管理、用户制卡中心与前端交互的完整系统,旨在帮助运营者实现合规引流,并掌握数据自主权与自动化运营能力。

weixin_29234423的博客 516

hpm6750evk2开发板(一)菜鸟入门

hpm6750与我们平时常用的stm单片机在开发环境和开发方法上有很大的区别,所以上手还是需要花一点时间的,拿到板子先不要急着上电调试,我们先找资料学习一下了,免得多走冤枉路,以下是我整理的一些学习资源,包括开发板使用手册、芯片SDK、开发工具、视频资料等,建议先把使用手册和学习视频先看了,再取搭建环境测试。最近刚入手一块hpm6750evk2开发板,花了几天时间学习,算是菜鸟入门了,今天分享一下学习过程。看完资料后,把开发工具安装上,下一篇文章我们分享一下调试工程的过程和遇到的问题。

Silas1750的博客 3083

Linux进程间通信:共享内存mmap、xsi和posix

前言 本文主要说明在Linux环境上如何使用共享内存。阅读本文可以帮你解决以下问题: 什么是共享内存和为什么要有共享内存? 如何使用mmap进行共享内存? 如何使用XSI共享内存? 如何使用POSIX共享内存? 如何使用hugepage共享内存以及共享内存的相关限制如何配置? 共享内存都是如何实现的? 使用文件或管道进行进程间通信会有很多局限性,比如效率问题以及数据处理使用文件描述符而不如内存地址访问方便,于是多个进程以共享内存的方式进行通信就成了很自然要实现的IPC方案。Linux系统在编程

jinking01的专栏 1825

[Linux项目实践] LCD Panel的硬件分析及调试

LCD硬件分析 项目使用3.5” TFT-LCD并且支持触摸控制。LCD的硬件可从几个方面学习:1)查看LCD的硬件连线。2)查看数据手册了解寄存器的控制。3)查看LCD DATASHEET了解硬件操作 1)LCD硬件连线 在图中有33个引脚,22根数据引脚和9根控制引脚。 LCD的工作原理:像素点是从左至右,从上至下逐个显示,LCD控制寄存器会从从内存中的framebuffer通

Terry_Yuan的技术专栏 3023

关于linux中,POSIX共享内存方法

这样做会在所有使用该对象的进程都断开连接后,释放共享内存资源。值得注意的是,POSIX共享内存对象可以使用文件路径来标识,而不是使用像System V共享内存那样的数字标识符。函数将共享内存映射到当前进程的地址空间。4. 进行读写操作: 一旦共享内存映射到进程的地址空间,就可以像访问本地内存一样进行读写操作。这个函数会根据传入的文件描述符和大小来调整共享内存的大小,使其适合存储数据。在Linux中,POSIX共享内存的实现是通过以下几个步骤完成的: 1. 创建或打开共享内存对象: 使用。

weixin_49146132的博客 426

DSP篇--C6678功能调试系列之EDMA3调试

EDMA主要用于数据的搬运,发送、接收,其搬运数据的形式有;AB模式,ABC模式以及ping-pong模式。 EDMA3分初始化、参数配置、以及中断配置。其中中断配置则需要注意的内容主要有:挂载的TC通道,对应的触发事件,以及中断的使能。

nanke_yh的博客 1720

YOLOv8改进,YOLOv8主干网络替换为FasterNet(全网独发手把手教学,助力涨点)

FasterNet的整体架构由四个分层阶段组成,每个阶段包含一组FasterNet模块,并在前面加一个嵌入或合并层。最后三层用于特征分类。每个FasterNet模块内部,一个PConv层后跟两个PWConv层,为了保持特征多样性并降低延迟,归一化和激活层仅在中间层之后进行,其中,PConv 是一种快速高效的卷积操作,通过仅对部分输入通道应用卷积滤波器,而保持其余通道不变,从而减少了计算量和内存访问。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 2015

linux应用 进程间通信之共享内存(POSIX)

本文阐述了进程间通信之共享内存(POSIX)的定义、应用场景、优缺点等,列举了编程中使用的接口,编写了测试用例测试相关功能。

cesheng3410的博客 2094

RAG 实战:LangChain + 向量数据库构建知识问答系统

从文档加载、分割、嵌入到检索增强生成,完整实现一个基于本地文档的知识问答系统。

kaixin110a的博客 187

linux进程间通信快速入门【二】:共享内存编程(mmap、XSI、POSIX)

使用文件或管道进行进程间通信会有很多局限性,比如效率问题以及数据处理使用文件描述符而不如内存地址访问方便,于是多个进程以共享内存的方式进行通信就成了很自然要实现的IPC方案。 LInux给我们提供了三种共享内存的解决方案: mmap内存共享映射。 XSI共享内存。 POSIX共享内存。 mmap内存共享映射 mmap可以将一个文件映射到内存中,在程序里就可以直接使用内存地址对文件内容进行访问,这可以让程序对文件访问更方便。 API: #include <sys/mman.h> void *m

hanhan的博客 1839

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

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

POSIX 共享内存是 POSIX.1b 标准定义的进程间通信机制, 允许多个进程共享同一块物理内存区域, 进程可以直接读写这块内存, 无需进行数据拷贝. 由于多个进程可以同时访问, 通常需要配合信号量等同步机制使用. POSIX 共享内存基于文件描述符模型, 使用名字标识, 在/dev/shm文件系统中可见.

荒坡_KingRumn 1353

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【操作系统】Linux 进程间通信(IPC)—共享内存(System V与POSIX API实现,基于生产者消费者问题)

Linux 进程间通信(IPC)—共享内存

MaxwellWong 6613

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Linux进程间通信之共享内存(POSIX)实现篇

基于 2.6.12 内核, 说明 POSIX 共享内存的核心数据结构、系统调用路径及关键实现. POSIX 共享内存通过 shmem(tmpfs) 文件系统实现, 主要文件:mm/shmem.cipc/shm.c(部分)、fs/namei.c(路径解析).

荒坡_KingRumn 769

linux进程间通信--共享内存(POSIX 版本)

linux进程间通信–共享内存(POSIX 版本) System V共享内存模型使用的是key和标识符,这与标准的UNIX I/O模型使用文件名和描述符的做法不一致。这种差异导致System V共享内存段需要一整套全新的系统调用和命令。由于这些潜在的缺点,因此POSIX标准又重新定义了共享内存API。 共享内存的使用:共享内存被映射到进程的虚拟地址空间之后,就可以跟正常的进程空间内存一样进行各种操作了。 其他说明: 共享内存并未提供同步机制。所以我们通常需要用其他的机制来同步对共享内存的访问,例如信号量.

guoweilkd的博客 523

Linux进程间通信六 Posix 共享内存简介与示例

1. 共享内存简介 共享内存主要用于不同进程之间相互通信,因为操作的是同一块地址,不需要内核和用户层之间数据拷贝,属于最快的进程间通信方式,不过,为了防止读写冲突,一般需要额外的同步手段。之前介绍了SystemV共享内存的使用方式,今天介绍下Posix共享内存。Posix 共享内存API主要有这几个,shm_open,用于获取或者创建一个共享内存文件描述符,ftruncate,用于设置共享内存的大小,新建的共享内存大小为0,mmap,用于将共享内存文件映射到进程的虚拟地址空间,其实共享内存真正核心的工作主

fuyuande的博客 1467

【Linux C | 进程】Linux 进程间通信的10种方式(2)

本文介绍进程间通信的五种方式:POSIX消息队列、POSIX信号量、POSIX共享内存、信号、套接字。

wkd_007的博客 1760

【Linux开发七】进程间通信|无名管道|命名管道|System V 消息队列|System V 信号量|System V 共享内存|POSIX消息队列|POSIX信号量|POSIX共享内存

进程间通信(简称IPC),指的是多个进程间进行数据交换和信息传递,在Linux系统下,每个进程都有着自己独立的地址空间和资源,想要进行通信就需要IPC机制。进程间通信目的:数据交换,资源共享,进程同步,传递消息。进程间通信的基本原理:不同的进程能访问和操作同一个内存空间。进程间通信的分类:有名管道和无名管道、System V消息队列,信号量,共享内存、POSIX 消息队列,信号量,共享内存、socket。System V和POSIX的主要区别在于System V底层使用命名空间。

2501_93649289的博客 943

Linux进程间通信(IPC)教程 Linux共享内存介绍:介绍POSIX共享内存的基本概念、用途和编程实践

POSIX共享内存概述 共享内存是最高效的IPC机制,因为它不涉及进程之间的任何数据传输。 这种高效率带来的问题是,我们必须用其他辅助手段来同步进程对共享内存的访问,否则会产生竞态条件。 因此,共享内存通常和其他进程间通信方式一起使用。 Linux下有三种共享内存的IPC技术:System V共享内存、共享文件映射(mmap)、POSIX共享内存。本文只介绍POSIX共享内存。 POSIX共享内存和POSIX消息队列,有名信号量一样都是具有随内核持续性的特点。 POSIX共享内存流程 ..

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 1674

linux进程间通信(posix信号灯+posix共享内存)实例

/* * * Filename: producer.c * * Description: 生产者进程 * * Version: 1.0 * Created: 09/30/2011 04:52:23 PM *

zhangzhenghe的专栏 1626

POSIX共享内存

POSIX共享内存标记,转自https://blog.youkuaiyun.com/anonymalias/article/details/9938865 Linux下个各种进程间的通信方式:管道,FIFO,消息队列,他们的共同特点就是通过内核来进行通信(假设POSIX消息队列也是在内核中实现的,因为POSIX标准并没有限定它的实现方式)。向管道,FIFO,消息队列写入数据需要把数据从进程复制到内核,从这些IPC读取数据的时候又需要把数据从内核复制到进程。所以这种IPC方式往往需要2次在进程和内核之间进行数据的复制,

June_we的博客 535

【Linux Posix】(14)进程间通信III - 共享内存

管道:A进程写入数据到管道,是用户空间切换到内核空间操作,B进程从管道读取数据,数据是从内核空间送到用户空间。用户空间和内核空间的数据切换是比较耗资源的。 共享内存:直接把共享内存的地址空间直接映射到自己的地址空间内部,那么数据操作就一直都在用户空间,不涉及用户空间和内核空间数据交互问题,所以效率是最高的。 *shmaddr:通常默认填写 0 , 让系统自动分配起始地址。 shmflag:通信默认填写 0 。 ...

风浪云HH的博客 276

Linux进程间通信(IPC)编程实践(八)共享内存的使用-POSIX 共享内存(API)

1、Posix提供了两种在无亲缘关系进程间共享内存区的方法: (1)内存映射文件:先有open函数打开,然后调用mmap函数把得到的描述符映射到当前进程地址空间中的一个文件(上一篇博文所用到的就是)。 (2)共享内存区对象:先有shm_open打开一个Posix IPC名字(也可以是文件系统中的一个路径名),然后调用mmap将返回的描述符映射到当前进程的地址空间。这两种方法都需要调用m

NK_test的博客 3494
上一篇: Linux进程间通信之POSIX信号量
下一篇: C++11多线程的使用
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值