Linux系统编程—进程间通信—共享内存
Linux共享内存
共享内存就是允许两个或多个进程共享一定的存储区。就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针。当一个进程改变了这块地址中的内容的时候,其它进程都会察觉到这个更改。因为数据不需要在客户机和服务器端之间复制,数据直接写到内存,不用若干次数据拷贝,所以这是最快的一种IPC。
共享内存的使用,主要有以下几个API:
1.获得一个ID号:ftok()
key_t ftok( const char * fname, int id )
fname就是你指定的文件名(已经存在的文件名),一般使用当前目录,如:
key_t key;
key = ftok(".", 1); 这样就是将fname设为当前目录。
2.创建共享内存 shmget()
int shmget(key_t key, size_t size, int shmflg);
第一个参数key,shmget()函数成功时返回一个与key相关的共享内存标识符(非负整数),用于后续的共享内存函数。调用失败返回-1.
第二个参数size,size以字节为单位指定需要共享的内存容量
第三个参数shmflg,shmflg是权限标志,它的作用与open函数的mode参数一样,如果要想在key标识的共享内存不存在时,创建它的话,可以IPC_CREAT做或操作。共享内存的权限标志与文件的读写权限一样,举例来说,0644,它表示允许一个进程创建的共享内存被内存创建者所拥有的进程向共享内存读取和写入数据,同时其他用户创建的进程只能读取共享内存。
3.绑定共享内存 (映射) shmat()
void *shmat( int shmid , char *shmaddr , int shmflag );
int shmid是那块共享内存的ID。
char *shmaddr是共享内存的起始地址,如果shmaddr为0,内核会把共享内存映像到调用进程的地址空间中选定位置;如果shmaddr不为0,内核会把共享内存映像到shmaddr指定的位置。所以一般把shmaddr设为0。
int shmflag是本进程对该内存的操作模式。如果是SHM_RDONLY的话,就是只读模式。其它的是读写模式
成功时,这个函数返回共享内存的起始地址。失败时返回-1
4.脱离共享内存 shmdt()
int shmdt( char *shmaddr );
参数char *shmaddr是那块共享内存的起始地址。
返回值:成功0,失败-1
5.控制共享内存 shmctl()
int shmctl( int shmid , int cmd , struct shmid_ds *buf );
ishmid是共享内存的ID。
cmd是控制命令,可取值如下:
IPC_STAT 得到共享内存的状态
IPC_SET 改变共享内存的状态
IPC_RMID 删除共享内存
struct shmid_ds *buf是一个结构体指针。IPC_STAT的时候,取得的状态放在这个结构体中。如果要改变共享内存的状态,用这个结构体指定。
返回值:成功0,失败-1
读端代码#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>int main()
{int shmid;char *shmaddr;key_t key=1;ftok(".",1);shmid=shmget(key,1024*4,0);if(shmid==-1){printf("shmid failed\n");exit(-1);}shmaddr=shmat(shmid,0,0);printf("shmat ok\n");printf("data:%s\n",shmaddr);shmdt(shmaddr);printf("quit\n");return 0;
}
写端代码#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>int main()
{int shmid;char *shmaddr;key_t key=1;ftok(".",1);shmid=shmget(key,1024*4,IPC_CREAT|0666);if(shmid==-1){printf("shmid failed\n");exit(-1);}shmaddr=shmat(shmid,0,0);printf("shmat ok\n");strcpy(shmaddr,"lhg");sleep(5);shmdt(shmaddr);shmctl(shmid,IPC_RMID,0);printf("quit\n");return 0;
}
Linux系统编程—进程间通信—共享内存相关推荐
- Linux基础入门--进程间通信--共享内存
Linux基础入门--进程间通信--共享内存 1.共享内存IPC原理 2.共享内存管理 1.共享内存IPC原理 共享内存进程间通信机制主要用于实现进程间大量的数据传输,共享内存是在内存单独开辟的一段内 ...
- 【Linux系统编程】进程内存模型
00. 目录 文章目录 00. 目录 01. Linux可执行程序结构 02. Linux进程结构 03. 存储类型总结 04. 附录 01. Linux可执行程序结构 在 Linux 下,程序是一个 ...
- Linux系统编程—进程间通信—信号量
信号量 信号量是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用.在进入一个关键代码段之前,线程必须获取一个信号量:一旦该关键代码段完成了,那么该线程必须释放信号量.其它想 ...
- Linux应用编程之共享内存实例
1共享内存实例 01 主要内容 上一小节小哥跟大家介绍了一下共享内存的知识,今天主要是做一个实战的演示,从而更好的理解共享内存的原理和实际应用. 02 程序示例 1#include &l ...
- Linux系统编程——进程间通信:命名管道(FIFO)
命名管道的概述 无名管道,由于没有名字,只能用于亲缘关系的进程间通信(更多详情,请看<无名管道>).为了克服这个缺点,提出了命名管道(FIFO),也叫有名管道.FIFO 文件. 命名管道( ...
- 【Linux】一步一步学Linux系统编程教程汇总(暂时暂停更新......)
00. 目录 文章目录 00. 目录 01. 概述和标准 02. 文件操作 03. 进程概念 04. 进程间通信 05. 多线程 06. 信号 07. 同步与互斥 08. 高级IO 09. 其它 10 ...
- 入门Linux系统编程--网络编程
文章目录 一.网络编程 1.socket服务端代码实现(无连接客户端) 6.socket服务端代码实现(连接客户端) 7.socket客户端代码实现 8.实现双方聊天 9.多方消息收发 二.往期文章 ...
- 嵌入式Linux系统编程学习之二十三 System V 共享内存机制
文章目录 前言 一.ftok 函数 二.shmget 函数 三.shmat 函数 四.shmdt 函数 五.shmctl 函数 补充 前言 共享内存也是进程间(进程间不需要有继承关系)通信的一种常 ...
- 【Linux | 系统编程】Linux系统编程(文件、进程线程、进程间通信)
文章目录 Linux系统编程 文件IO open/close函数 read/write函数 文件描述符 阻塞.非阻塞 fcntl函数 lseek函数 传入传出参数 文件系统 文件存储 文件操作 sta ...
最新文章
- “机器学习还是很难用!”
- 财付通接口(asp)
- 自考18年4月计算机应用基础,2019年自学考试计算机应用基础试题(18)
- 华为ipd项目管理流程_IPD:一套卓越的产品开发经营体系
- CCNP-17 OSPF试验13(BSCI)
- win10更改计算机时间格式,Win10电脑锁屏的时钟格式怎么更改
- 自动驾驶(五十八)---------自动驾驶2019年终盘点
- Matlab | 画图线型及颜色符号汇总
- 测试用例设计——正交实验法
- 近期BSN开发常见问题答疑
- 微信公众平台学习笔记
- Java中Ascall码的使用
- Merge用法:Oracle 10g中对Merge语句的增强
- Cisco ❀ ICMP-互联网控制报文协议
- 学java被“劝退”的第八天
- 机器学习工程师 - Udacity 项目:实现一个狗品种识别算法App
- linux之/proc/cpuinfo详解
- 【笔记】KMeans聚类算法
- 嵌入式Linux项目开发流程
- 多维度了解一对多远程培训系统