Linux进程间的通信(四)System-V共享内存

什么是共享内存

        共享内存,顾名思义就是允许两个不相关的进程访问同一个逻辑内存,共享内存是两个正在运行的进程之间共享和传递数据的一种非常有效的方式。

        不同进程之间共享的内存通常为同一段物理内存。进程可以将同一段物理内存连接到他们自己的地址空间中,所有的进程都可以访问共享内存中的地址。

        如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。

共享内存并未提供同步机制,也就是说,在第一个进程结束对共享内存的写操作之前,并无自动机制可以阻止第二个进程开始对它进行读取,所以我们通常需要用其他的机制来同步对共享内存的访问,例如信号量。

关于信号量的知识,将在线程安全中介绍

共享内存和消息队列各个参数:

 

共享内存api

分配一块共享内存

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

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

key:密钥 
size: 共享内存的大小  必须是 PAGE_SIZE 整数倍 ,getconf PAGE_SIZE  查看大小
shmflg: 权限 
              IPC_CREAT 创建 
              IPC_EXCL 检查是否存在 

返回值:  成功 共享内存对象
              失败  -1


映射共享内存

#include <sys/types.h>
#include <sys/shm.h>

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

shmid:共享内存对象id 
shmaddr:填写为NULL ,系统自动选择映射地址 
shmflg:属性默认为  0  
返回值:  
映射成功 返回指向共享内存的指针 
              映射失败  (void *) -1
 

int shmdt(const void *shmaddr); //解除映射


控制共享内存

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

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

cmd参数见上一篇消息队列

销毁共享内存

shmctl(shmid,IPC_RMID,NULL);


创建一个共享内存,通过键盘往内存中写入数据

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

int main()
{
    //1.创建密钥
   key_t  key= ftok("/home",120);


   //2.创建共享内存对象 
   int shmid = shmget(key,4096,IPC_CREAT|0777);
    if(shmid < 0)
    {
        perror("创建共享内存失败\n");
        return -1;
    }else 
    {
        printf("创建共享内存成功\n");
    }


    //3.映射共享内存  
    char *p = shmat(shmid,NULL,0);

    while (1)
    {
       //4.从键盘获取数据到共享内存中 
         scanf("%s",p);
    }
    
}

 

创建一个共享内存,不断读取共享内存中的数据

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

int main()
{
    //1.创建密钥
   key_t  key= ftok("/home",120);


   //2.创建共享内存对象 
   int shmid = shmget(key,4096,IPC_CREAT|0777);
    if(shmid < 0)
    {
        perror("创建共享内存失败\n");
        return -1;
    }else 
    {
        printf("创建共享内存成功\n");
    }


    //3.映射共享内存  
    char *p = shmat(shmid,NULL,0);

    while (1)
    {
       printf("%s\n",p);
       sleep(1);
    }
    
    getchar();
}

 参考:进程间通信——共享内存(Shared Memory)_进程间通讯 共享内存-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值