Linux进程间通信——共享内存

【Linux】Linux 共享内存:高效的进程间通信 共享内存是一块可以被多个进程同时访问的内存区域,允许不同进程读取和写入同一份数据。每个进程都可以直接访问这块内存,不需要通过管道、套接字或消息队列进行数据传输。这种直接访问的特点使得共享内存成为最为高效的进程间通信机制之一,适用于需要频繁交换大量数据的场景。 阅读详情

System V共享内存

System V 标准的进程间通信方式是在OS层面专门为进程间通信设计的一个方案,通过系统调用的方式给用户提供功能。在同一个主机内的进程间通信方案叫作system V方案。
共享内存区是最快的IPC形式,一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说进程不再通过执行进入内核的系统调用来传递彼此的数据。

共享内存函数接口

shmget

功能:用来创建共享内存

int shmget(key_t key, size_t size, int shmflg);

参数:
key:这么共享内存段名字
size:共享内存大小
shmflg:由九个权限标志构成
返回值:成功返回一个非负整数,即该共享内存段的标识码,失败返回-1

shmat

功能:将共享内存段连接到进程地址空间

void *shmat(int shmid, const void *shmaddr, int shmflg);

参数
shmid:共享内存标识
shmaddr:指定连接的地址
shmflg:它的两个可能取值是SHM_RND和SHM_RDONLY
返回值:成功返回一个指针,指向共享内存第一个字节,失败返回-1
说明:
shmaddr为NULL,核心自动选择一个地址
shmaddr不为NULL且shmflg无SHM_RND标记,则以shmaddr为连接地址
shmaddr不为NULL且shmflg设置了SHM_RND标记,则连接的地址向下调整为SHMLBA的整数倍,公式:shmaddr - (shmaddr % SHMLBA)
shmflg = SHM_RDONLY,表示连接操作用来读共享内存

shmdt

功能:将共享内存段与当前进程脱离

int shmdt(const void *shmaddr);

参数:
shmaddr:由shmaddr:由shmat所返回的指针
返回值:成功返回0,失败返回-1

shmctl

功能:用于控制共享内存

int shmctl (int shmid, int cmd, struct shmid_ds * buf);

shmid:由shmget返回的共享内存标识码
cmd:将要采取的动作
buf:指向一个保存着共享内存的模式状态和访问权限的数据结构
返回值:成功返回0,失败返回-1

示例

在这个实例中我们希望在客户端(client)写入数据,服务端读取数据。共享内存只需在服务端申请一次即可,但在客户端和服务端中都要与共享内存连接。

server.c

#include "comm.h"                                                                                                "
#include <unistd.h>                                                                                                 
                                                                                                 
int main()                                                                                                 
{
// 提供一个文件地址和Id,以得到一个唯一标识值
// 并非随机值,只要地址和Id相同,就会得到相同的值
// 因此在server和client中要保证文件地址和Id相同
// 以得到同一个id                                                                                              
  key_t key = ftok(PATH_NAME, PRO_ID);                                                                                                 
  if (key < 0)                                                                                                 
  {                                                                                                 
    perror("ftok");                                                                                                 
    return 1;                                                                                                 
  }                                                                                                 
  printf("%u\n", key);                                                                                                 
  int shmid = shmget(key, SIZE, IPC_CREAT | IPC_EXCL | 0666);                                                                             
  //                如没有则创建,有则返回已有的                                                                          
  //                如没有则创建,有则报错                                                                          
  if (shmid < 0)                                                                                         
  {                                                                          
    perror("shmget");                                                                              
    return 2;                                                                                                    
  }                                                                                                 
  printf("shmid : %u\n", shmid);                                                                                      
  //sleep(10);                                                                                                
  char *mem = (char*)shmat(shmid, NULL, 0);                                                                          
  while (1)                                                                                                                      
  {                                                                                                            
    printf("%s\n", mem);                                                                          
    sleep(1);                                                                                      
  }                                                                                                         
  shmdt(mem);                                                                                       
  // 并非释放了此共享内存,只是解除共享内存与该进程的关联     
  printf("attach success\n");                                                                                 
  shmctl(shmid, IPC_RMID, NULL); 
  return 0;                                                                                                                               
}

client.c

#include "comm.h"

int main()
{
  key_t key = ftok(PATH_NAME, PRO_ID);
  if (key < 0)
  {
    perror("ftok");
    return 1;
  }
  printf("%u\n", key);
  
  int shmid = shmget(key, SIZE, IPC_CREAT);
  if (shmid < 0)
  {
    perror("shmget");
    return 2;
  }
  char *mem = (char*)shmat(shmid, NULL, 0);
  printf("client attach success\n");
  //sleep(5);
  char ch = 'A';
  while (ch <= 'Z')
  {
    mem[ch - 'A'] = ch;
    ch++;
    mem[ch - 'A'] = 0;
    sleep(2);
  }
  shmdt(mem);
  printf("client detach success\n");
  sleep(5);
  return 0;
}

comm.h

#pragma once 

#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <unistd.h>

#define PATH_NAME "./"
#define PRO_ID 0x666
#define SIZE 4096

总结

在本篇文章中对共享内存的操作主要是这几块
1.创建共享内存
流程:获取一个key值,用这个key值来获得id
2.关联共享内存
通过shmat函数
3.去关联共享内存
通过shmdt函数
4.释放共享内存
通过shmctl函数

linux进程间通信之共享内存篇 首先打开一个或者创建一个文件,并把文件长度设置为5个people结构大小,然后使用mmap函数,把该文件映射到进程空间,len设置为10个people结构的大小,请注意此时文件大小和映射到进程空间的地址并不一样,这是被允许的,进程空间设置的大小受文件大小的影响但不一定要等于文件的大小,以指定的格式向该映射内存中写入10个people的数据;由于父子进程特殊的亲缘关系,在父进程中先调用mmap(),然后调用fork,那么在fork之后,子进程继承父进程匿名映射后的地址空间,同样也继承mmap返回的地址; 阅读详情

相关推荐

linux进程间通信之共享内存

linux进程间通信,共享内存

weixin_50374599的博客 1304

Linux进程间通信:共享内存(shm)

比如:在一家餐厅中,有编号为a b c d e五张桌子,张三约了小美在c号桌一起吃饭,那么小美赴约直接到c号桌与张三共同用餐。如果张三和小美没有协议好在c桌用餐,那么他们就可能不会在同一张做桌子上吃饭,就完成不了这次约会。

m0_74985965的博客 2534

发那科FOCAS 1/2文档——核心库文件

在开始开发前,明确目标 CNC 的具体型号、连接方式(HSSB/TCP/IP)、软件版本和配置(如轴数、程序号位数),并据此正确配置开发环境和编译选项。开发时需要包含相应的头文件。这是开发跨平台应用时需要特别注意的地方。这是开发应用时必须了解的核心文件。

snailiot的博客 1021

03进程间通信——共享内存 (shm)(✔)

共享内存其实就是通过映射的方式使得多个进程可以同时访问同一块内存,换而言之就是将一块内存 同时映射到多个进程的进程地址空间中,借此这些进程就可以通过这块内存进行数据交流。映射:把内核或者设备或者文件中的一段内存映射到进程地址空间,映射成功后,进程就可以直接利用指针去操作这一段内存 (操作映射后的指针,就相当于操作这一段内存)由于是多个进程共享一段内存,这段内存既是你的,又是我的,p1往这段内存中写入数据,实际上就是写入p2的内存中。进程P1可以映射并且操作这一段内存,同时P2也可以映射并且操作这一段内存。

qq_68915288的博客 999

换频道——假想《道德经》与量子力学的一些联系

之前看到一位AI PM的前辈分享了自己对于PM境界的看法: 境界一,行事被放心。 境界二,独立主导产品线从0到1,做正确的事,并把事做正确。 境界三,一切以灵魂境界为基础,产品作为其理念的衍生。 对于我,3个月尝试于目标而无获,但塞翁失马焉知非福。自己已经具备境界一,虽然境界二尚未成熟,但境界三却有幸有所思考。 今天,往澳门的动车途中有感而发,为随笔。

1021

机器人视觉联动精度优化:从±2mm到±0.02mm,产线级手眼标定全实战

2025年我接东莞长安Type-C接口分拣项目的时候,就是栽在了手眼标定上:实验室里标定完精度±0.5mm,一到产线直接掉到±2mm,机器人10次有3次抓不住,2000多件Type-C接口直接报废,还撞坏了2套汇川SCARA机器人的吸盘,本来45天的工期拖了3个月,不仅没赚到钱,还倒贴了几万块。手眼标定从来不是简单的跑个demo、算个矩阵就完事了,它是一个系统工程:从硬件选型、安装固定、相机标定、标定流程、算法优化、环境控制、重复验证,每一个环节都会影响最终的联动精度。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 387

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

例2:进程A从键盘循环获取数据并拷贝到共享内存中,进程b从共享内存中获取并打印数据。要求进程a输入一次,进程b输出一次,a不输入,b就不输出。一般给0代表可读可写,可以给SHM_RDONLY 为只读模式,其他为读写。例1:进程A向共享内存写入数据,进程B从共享内存中读取数据并显示。A(./main)未输入时,B(./test)不输出(阻塞着)而输出的时候一直输出S内的数据,没有控制,会一直循环输出。正确流程是写入一次读取一次,不写入不读取。A输入end,A,B退出。A输入一个,B读取一个。

qq_53830608的博客 2032

planning模块(6)-参考线的平滑(二次规划)

上一篇已经介绍了采样点生成锚点数据的过程,并且将所有采样点生成的锚点数据设置到了平滑器中.接下来继续介绍使用二次规划平滑参考线的算法过程.从锚点数据中提取坐标存入raw_point2d,提取横向边界存入anchorpoints_lateralbound,将起点和终点的横向边界设置为0,防止车在起点和终点位置偏离车道中心线.

让复杂的问题变得更容易理解 788

共享内存shm

1 共享内存的原理 共享内存的接口 2 共享内存的特性 2.1生命周期跟随操作系统 2.2共享内存采用的是覆盖写的方式,读的时候, 是访问地址 2.3共享内存的删除特性

sy2453的博客 1869

Unity内存优化:从崩溃到流畅的终极指南

Emscripten 为 WebAssembly 设定的内存布局(Static、Stack 和 Heap)为开发者提供了一个清晰的内存管理框架。理解这些内存区域的特性和用途,有助于开发者在 WebGL 项目中更有效地管理内存,优化性能,减少内存使用峰值。在 Unity WebGL 中,Dynamic Memory 是 UnityHeap 的主要组成部分,负责存储游戏运行时所需的各种数据。Dynamic Memory 主要分为两类:Managed Memory 和 Native Memory。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 358

Python爬虫实战:逆向解析天猫商品详情API,精准捕获规格、SKU与促销活动

及浏览器开发者工具),绕过前端渲染的复杂性,直接逆向分析并调用其内部数据接口,从而高效、稳定地抓取商品的关键信息,包括商品规格、多维度SKU信息以及复杂的促销活动。print(f"SKU ID: {sku.sku_id}, 价格: ¥{sku.price}, 库存: {sku.stock}, 规格: {sku.props}")当你访问一个商品链接时,浏览器首先会加载一个几乎为空的HTML骨架,然后通过执行大量的JavaScript代码,向后台服务器发起多个异步请求,最终将获取到的数据填充到页面中。

2201_76125261的博客 1129

共享内存机制——mmap和shm

共享内存是进程间通信的一种方法,常用到的有mmap和shm,下面做一个比较。 mmap机制: 在磁盘上建立一个文件,然后把文件内容映射到虚拟内存上,在每个进程的虚拟存储器里面,单独开辟一个空间来进行映射。在多进程情况下,不会对实际的物理存储器(主存)消耗太大。 即将一个文件或者其它对象映射到进程的虚拟地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一 一对映关系。 实现这样的映射关系后...

PPprogrammer的博客 3549

Arduino ESP32 Web服务器从microSD卡读取

Arduino ESP32 Web服务器从microSD卡读取 将网页内容放到SD卡中,当有客户端数据请求时,从SD卡读取信息进行发送,比起SPIFFS文件系统,更节约板上的硬件资源。 SD卡接线说明 ESP32----- SD D5(GPIO 5)-----CS D18(GPIO 18)-----SCK D19(GPIO 19)-----MISO D23()GPIO 23-----MOSI 文件放置 需要把文件放置到SD卡的根目录下。注意SD卡的格式FAT32格式。 实例代码 /*

perseverance51博客 1434

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

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

Renswc的博客 2486

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

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

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

GGDxianv的博客 1106

深度学习工具包 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进程间通信】共享内存

本篇博客将介绍system V共享内存

m0_74215144的博客 1114

温度PID控制PLC程序

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

【Linux-进程间通信】共享内存

ipcs是一个用于查看 POSIX 系统中进程间通信 (IPC) 资源信息的命令行工具。使用-m选项可以专门查看共享内存 (shared memory) 的相关信息。常用选项描述-m显示共享内存段的信息-q显示消息队列的信息(不与-m一起使用)-s显示信号量的信息(不与-m一起使用-t显示创建时间-p显示创建者的 PID-c显示核心映像的创建者-l显示更详细的列表字段含义key用于访问共享内存段的键值。这个键是由ftok。

2202_75331338的博客 2047

Linux:进程间通信->共享内存

共享内存实现进程间通信

m0_68142120的博客 1163

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

我们无论使用命名管道还是匿名管道,都是在文件层面上实现的通信,实际上还有基于系统层面的system v标准的进程间通信方式。因为操作系统不相信用户,所以用户使用的时候只能通过调用的方式system v提供的主流方式有三个:1.共享内存 2.消息队列(有些落伍)3.信号量前两个以传送数据为目的,第三个以实现进程间同步后者互斥为目的。

Au_ust的博客 1090

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

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

EterNity_TiMe_的计算机学习之路 3117

【Linux】进程间通信之共享内存

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

Scenlyf的博客 2903

Linux——进程间通信之SystemV共享内存

SystemV通信一般包括三种:共享内存、消息队列和信号量。共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到 内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。

m0_75262940的博客 920
上一篇: Linux进程间通信——命名管道
下一篇: Linux进程间通信——信号量
JayceSun449
博客等级 码龄5年 554粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JayceSun449

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值