共享内存笔记

1、设置key值
2、创建一个共享内存,并且设定一个返回值为共享内存标识符。
3、建立起系统内存的映射,映射到数据段。这个数据段就是相当于要使用的字符串。 如果对内存进行写入,建议使用bzero先清空内存,然后使用strcpy读入就好。注意:我所学的写入没有解除数据段和删除共享内存
4、解除数据段
5、删除共享内存。

shm_read.c

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

int main(){
        //共享内存标识符
        int shmid;
        int ret;
        key_t key;
        char *shmadd;
        /*建立一个key值*/
        key = ftok(".",2012);
        if(key == -1)
                perror("key");
        //查看系统共享内存
        system("ipcs -m");
        /*创建一个,key值;大小(字节为单位);控制的属性*/
        shmid = shmget(key,BUFSZ,SHM_R|SHM_W);
        if(shmid < 0){
                perror("shmget");
                exit(-1);
        }
        //共享内存的映射;NULL为地址,返回为共享内存段的首地址。
        //我的理解为,从内存段映射到数据段,更容易进行读写操作。
        //这个地址就相当于是所要使用的消息,在下文可以调用。
        //0 为权限和条件,代表的意思是可读可写
        shmadd = shmat(shmid,NULL,0);
        if(shmadd < 0){
                perror("shmat");
                exit(-1);
        }

        printf("copy data from shared-memory\n");
        printf("data = [%s]\n",shmadd);
        //使用完之后要解除系统映射。解除的是映射地址。所以是映射的首地
址。
        ret = shmdt(shmadd);
        if(ret < 0){
                perror("shmdt");
                exit(1);

        }
        else
                printf("deleted shared-memory\n");
        //对共享内存进行控制。IPC_RMID是删除。
        shmctl(shmid,IPC_RMID,NULL);
        system("ipcs -m");
        return 0;
}

shm_write.c

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

#define BUFSZ 2048

int main(){
        int shmid;
        int ret;
        key_t key;
        char *shmadd;
     //return key number 
        key = ftok(".",2012);
        if(key == -1)
                perror("ftok");
        // return shm number
        shmid = shmget(key,BUFSZ,SHM_R|SHM_W|IPC_CREAT);

        if(shmid < 0)   {
                perror("shmget");
                exit(-1);
        }
        // she zhi shm
        shmadd = shmat(shmid,NULL,0);
        if(shmadd < 0){
                perror("shmat");
                _exit(-1);
        }
        printf("copy data to shared_memory \n");
        //clear shm
        bzero(shmadd,BUFSZ);
        //give smh sonmthing
        strcpy(shmadd,"data in shared memory\n");

        return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值