Linux学习笔记(共享内存 +⽂件锁 + 信号量 +Shell脚本编程 +云服务器⼊⻔) 之共享内存

共享内存 

前⾔ 

之前我们已经学习过两种进程间通信IPC(Inter-process commucation)的蛮式:伫件和管道。今天 

我们将学习另外⼀种IPC⽅式 - 共享内存这三种⽅式分别通过磁盘,内核和⽤户空间进⾏进程间 

数据的传输。我们应根据使⽤场景选择合适的IPC⽅式。 

概念 

共享内存是进程间通讯IPC的⼀种,两个或多个进程可以共同访问同⼀块内存区域。共享的内存段是 

⽤户内存的⼀部分,每个进程都有⼀个指向此内存段的指针。依靠访问权限的设置,所有进程都可以 

读取这⼀块空间中的数据。共享内存段对于进程⽽⾔,就类似于共享变量对于线程⼀样。 

    共享内存是是三种IPC⽅式中最快的。 

    每个共享内存段都有⼀个整形关键字。 

    Key =>共享内存ID =>地址 

    共享内存段在内存中不依赖于进程的存在⽽存在。 

Linux学习笔记(共享内存 +⽂件锁 + 信号量 +Shell脚本编程 +云服务器⼊⻔) 之共享内存

- - - - - - - - - - - - 第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”); 

   } 

本篇非作者所著:来自一位大神!