共享内存 未完结

写入共享内存数据

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int main()
{
    key_t key=ftok(".",'b');//ftok函数返回钥匙,.为当前目录,'b'为字符
    if(key < 0)
    {
        printf("key");
        exit(-1);
    }
    printf("key=%d\n",key);
    int ret=shmget(key,512,0664|IPC_CREAT);//shmget函数返回共享内存段标识符,key为钥匙 填IPC_PRIVATE创建的共享内存只能用于具有亲缘关系的进程间通信,512为共享内存区大小,0664为8进制权限|IPC_CTEAT为创建一个新的段。如果这个标志未被使用,那么shmget()将找到与key相关的段,并检查用户是否有访问该段的权限。
    if(ret<0)
    {
        printf("ret");
        exit(-1);
    }
    printf("ret=%d\n",ret);
    void *addr=shmat(ret,NULL,0);//shmat函数返回共享内存区映射后的地址,ret为shmget函数返回的内存段标识符,NULL为系统自动完成映射地址 也可以自己给定安全合法的地址,0为共享内存可读可写 填SHM_RDONLY为只能读不能写
    if(addr==(void*)-1)
    {
        printf("shmat");
        exit(-1);
    }
    while(1)
    {
        fgets((char*)addr,512,stdin);//写入共享内存 访问共享内存映射地址即可
    }

   /* printf("shmat=%p\n",addr);
    int shmd=shmdt(addr); //取消映射
    if(shmd<0)
    {
        printf("shmdt");
        exit(-1);
    }
    int shmct=shmctl(ret,IPC_RMID,NULL);//shmct函数是删除共享内存,IPC_RMID为删除对象/IPC_SET为设置对象属性/IPC_STAT为获取对象属性,NULL在使用IPC_RMID时使用
    if(shmct<0)
    {
        printf("shmctl");
        exit(-1);
    }
    */
    return 0;
}

读取共享内存数据

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int main()
{
    key_t key=ftok(".",'b');//ftok函数返回钥匙,.为当前目录,'b'为字符
    if(key < 0)
    {
        printf("key");
        exit(-1);
    }
    printf("key=%d\n",key);
    int ret=shmget(key,512,0664|IPC_CREAT);//shmget函数返回共享内存段标识符,key为钥匙,512为共享内存区大小,0664为8进制权限|IPC_CTEAT为创建一个新的段。如果这个标志未被使用,那么shmget()将找到与key相关的段,并检查用户是否有访问该段的权限。
    if(ret<0)
    {
        printf("ret");
        exit(-1);
    }
    printf("ret=%d\n",ret);
    void *addr=shmat(ret,NULL,0);//shmat函数返回共享内存区映射后的地址,ret为shmget函数返回的内存段标识符,NULL为系统自动完成映射地址 也可以自己给定安全合法的地址,0为共享内存可读可写 填SHM_RDONLY为只能读不能写
    if(addr==(void*)-1)
    {
        printf("shmat");
        exit(-1);
    }
  
    while(1)
    {
    printf("%s\n",(char*)addr);//直接访问共享内存地址即可完成打印

    }
   /* printf("shmat=%p\n",addr);
    int shmd=shmdt(addr); //取消映射
    if(shmd<0)
    {
        printf("shmdt");
        exit(-1);
    }
    int shmct=shmctl(ret,IPC_RMID,NULL);//shmct函数是删除共享内存,IPC_RMID为删除对象/IPC_SET为设置对象属性/IPC_STAT为获取对象属性,NULL在使用IPC_RMID时使用
    if(shmct<0)
    {
        printf("shmctl");
        exit(-1);
    }
    */
    return 0;
}

共享内存

使用流程:

创建或者打开共享内存 -- shmget()

内存映射-- shmat()

访问共享内存

取消映射-- shmdt ()

删除共享内存-- shmctl()

全部评论

相关推荐

孤寡孤寡的牛牛很热情:为什么我2本9硕投了很多,都是简历或者挂,难道那个恶心人的测评真的得认真做吗
点赞 评论 收藏
分享
10-07 23:57
已编辑
电子科技大学 Java
八街九陌:博士?客户端?开发?啊?
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务