0
点赞
收藏
分享

微信扫一扫

Linux进程间通信(IPC)之共享内存的简单编程

伽马星系 2022-03-11 阅读 94
linux

1.共享内存的概述

共享内存(Shared Memory),是指两个或多个进程共享一个给定的存储区。在所有的IPC中,共享内存是用的比较多的IPC方式。

Linux系统中可以用 “ipcs -m” 指令查看共享内存,可以使用 “ipcrm -m 共享内存ID”来删除系统中的共享内存。

2.共享内存的特点

  • 共享内存是最快的IPC方式,因为进程会对内存进行直接的访问。
  • 共享内存可以允许多个进程同时操作,所以需要进行同步。
  • 信号量和共享内存通常搭配使用,信号量的作用主要是用来同步对共享内存的访问。

3.共享内存常用API

4.共享内存的编程思路

             a.创建共享内存

             b.映射/挂载内存

             c.数据交换

             d.断开映射/挂载

             e. 杀死共享内存

5.各API的编程方式

  •  创建共享内存

第一个参数是key值;第二个参数是内存大小(共享内存的大小与MB对齐);第三个参数是标志位,可以用可读可写的方式创建共享内存,如果共享内存存在则不设置第三参数。

  • 映射/挂载空间

第一个参数为共享内存的ID;第二个参数写0,让系统自己分配内存;第三个参数写0,用可读可写的方式打开。

  • 写/读数据
  • 断开挂载
  • 杀死共享内存

第一个参数是共享内存ID;第二个参数:IPC_RMID;第三个参数:一般为0

6.进程使用共享内存的完整代码:

 shareread.c

#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
        int shmid;
        char *shmaddr;
        key_t key;
        key=ftok(".",1);
        //printf("%x\n",key);
        shmid=shmget(key,1024*4,0);
        if(shmid==-1){
                printf("error!\n");
                exit(-1);
        }
        shmaddr=shmat(shmid,0,0);
        printf("shmat ok");
        printf("data=%s\n",shmaddr);
        shmdt(shmaddr);
        return 0;
}
~          

sharewrite.c

#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
        int shmid;
        char *shmaddr;
        key_t key;
        key=ftok(".",1);
        //printf("%x\n",key);
        shmid=shmget(key,1024*4,IPC_CREAT|0666);
        if(shmid==-1){
                printf("error!\n");
                exit(-1);
        }
        shmaddr=shmat(shmid,0,0);
        printf("shmat ok\n");
        strcpy(shmaddr,"LinXuZhiWei");
        sleep(15);
        shmdt(shmaddr);
        shmctl(shmid,IPC_RMID,0);
        printf("quit!");
        return 0;
}

举报

相关推荐

0 条评论