Linux学习笔记(共享内存 +⽂件锁 + 信号量 +Shell脚本编程 +云服务器⼊⻔) 之共享内存
共享内存
前⾔
之前我们已经学习过两种进程间通信IPC(Inter-process commucation)的蛮式:伫件和管道。今天
我们将学习另外⼀种IPC⽅式 - 共享内存这三种⽅式分别通过磁盘,内核和⽤户空间进⾏进程间
数据的传输。我们应根据使⽤场景选择合适的IPC⽅式。
概念
共享内存是进程间通讯IPC的⼀种,两个或多个进程可以共同访问同⼀块内存区域。共享的内存段是
⽤户内存的⼀部分,每个进程都有⼀个指向此内存段的指针。依靠访问权限的设置,所有进程都可以
读取这⼀块空间中的数据。共享内存段对于进程⽽⾔,就类似于共享变量对于线程⼀样。
共享内存是是三种IPC⽅式中最快的。
每个共享内存段都有⼀个整形关键字。
Key =>共享内存ID =>地址
共享内存段在内存中不依赖于进程的存在⽽存在。
- - - - - - - - - - - - 第2页 - - - - - - - - - - - -
相关函数
1.shmget
作⽤:创建⼀块共享内存空间
头⽂件:#include <sys / shm.h>
函数原型:int shmget(key_t key,size_t size,int shmflg)
参数说明:
key:ftok()的返回值
size:想要创建的共享内存的伫⼤⼩⼩
shm fl g:共享内存段的创建标识
返回值:
成功:返回共享内存空间标识符shm_id
失败:返回-1
2.shmctl
作⽤:对共享内存进程操作,包括:读取/设置状态,删除操作
头⽂件:#include <sys / shm.h>
函数原型:int shmctl(int shmid,int cmd,struct shmid_ds * buf)
参数说明:
shmid:shmget()的返回值,共享内存空间的标识符
BUF:临时共享内存变量信息
cmd:操作选项
返回值:
成功:返回0
失败:返回-1
3.shmat
----------------------- Page 3 -----------------------
作⽤:将共享内存空间挂载到进程中
头⽂件:#include <sys / shm.h>
函数原型:void * shmat(int shmid,const void * shmaddr,int shmflg)
参数说明:
shmid:shmget()的返回值,共享内存空间的标识符
shmaddr:共享内存的映射地址,⼀般类为0(由系统桐杈动分配地址)
shm fl g:访问权限和映射条件
返回值:
成功:返回共享内存段⾸⾸地址
失败:NULL /(void *) - 1
4.shmdt
作者:将进程与共享内存空间分离(只是与共享内存不不再有联系,并没有删除共享内存)
头⽂件:#include <sys / shm.h>
函数原型:int shmdt(const void * shmaddr)
参数说明:
shmaddr:共享内存的⾸⾸地址
返回值:
成功:返回0
失败:返回-1
示例代码
shmread.c
#include <sys / ipc.h>
#include <sys / shm.h>
#include <sys / types.h>
#include <string.h>
#include <stdio.h>
主要(){
int seg_id = shmget(99,128,0777);
char * p;
p = shmat(seg_id,NULL,0);
printf(“%s”,p);
}
shmwrite.c
----------------------- Page 4 -----------------------
#include <sys / ipc.h>
#include <sys / shm.h>
#include <sys / types.h>
#include <string.h>
主要(){
int seg_id = shmget(99,128,IPC_CREAT | 0777);
char * p;
p = shmat(seg_id,NULL,0);
strcpy(p,“Hello shm!\ n”);
}
本篇非作者所著:来自一位大神!