首页 > 系统相关 >共享内存

共享内存

时间:2023-05-01 16:22:16浏览次数:21  
标签:IPC 共享内存 shmaddr int shmid include

# write.c

/*

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

        int shmget(key_t key, size_t size, int shmflg);
            作用:创建一个新的共享内存段,或获取一个既有共享内存段的标识
                新创建的段会初始化为0
            参数:
                key:是一个整形,通过这个找到或创建一个共享内存,
                    一般使用16进制,非0值
                    随便自定义即可
                size:共享内存的大小
                shmflg:
                    访问权限
                    附加属性:创建/判断共享内存是否存在
                        创建:IPC_CREAT
                        判断:IPC_EXCL,需要和IPC_CREAT一起使用
                            IPC_CREAT | IPC_EXCL | 0664
                返回值:
                    成功:共享内存标识
                    失败:-1
                
        #include <sys/types.h>
        #include <sys/shm.h>

        void *shmat(int shmid, const void *shmaddr, int shmflg);
            功能:将共享内存与当前进程关联
            参数:
                shmid:标识
                shmaddr:申请的共享内存起始地址,传入NULL即可,由内核指定
                shmflg:权限
                    SHM_RDONLY,读权限,必须要有
                    0,读写
            返回值:
                成功:共享内存起始地址
                失败:void * -1

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

        int shmdt(const void *shmaddr);
            功能:解除当前进程和共享内存的关联
            参数:
                shmaddr:共享内存首地址
            返回值:
                成功:0
                失败:-1
    

        #include <sys/ipc.h>
        #include <sys/shm.h>
        int shmctl(int shmid, int cmd, struct shmid_ds *buf);
            功能:操作共享内存,主要使用删除功能
            参数:
                shmid:标识
                cmd:操作命令
                    IPC_STAT:获取共享内存当前状态
                    IPC_SET:设置共享内存的状态
                    IPC_RMID:标记共享内存被删除
                buf:需要设置或获取的共享内存属性信息
                    IPC_STAT:获取的数据
                    IPC_SET:需要设置的数据
                    IPC_RMID:NULL


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

        key_t ftok(const char *pathname, int proj_id);
            功能:根据指定的路径和int值,生成一个共享内存的key
            参数:
                pathname:指定一个存在的路径
                    /home/wtsruvf/Linux/a.txt
                proj_id:int类型的值,但系统调用只会只用其中一个字节
                        因此一般指定一个字符即可,如'a' 

*/


#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/shm.h>
#include <string.h>
int main()
{
    // 创建共享内存
    int shmid = shmget(100, 4096, IPC_CREAT | 0777);

    // 共享内存与当前进程关联
    void *shmaddr = shmat(shmid, NULL, 0);

    // 写数据
    char *str = "Hello World";
    memcpy(shmaddr, str, strlen(str));

    printf("please press any key to continue\n");
    getchar();



    // 解除关联
    shmdt(shmaddr);

    // 删除共享内存
    shmctl(shmid, IPC_RMID, NULL);



    return 0;
}

 

# read.c

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/shm.h>
#include <string.h>
int main()
{
    // 获取共享内存
    int shmid = shmget(100, 4096, IPC_CREAT);

    // 共享内存与当前进程关联
    void *shmaddr = shmat(shmid, NULL, 0);

    // 读数据
    printf("%s\n", (char *)shmaddr);

    printf("please press any key to continue\n");
    getchar();



    // 解除关联
    shmdt(shmaddr);

    // 删除共享内存
    shmctl(shmid, IPC_RMID, NULL);




    return 0;
}

 

标签:IPC,共享内存,shmaddr,int,shmid,include
From: https://www.cnblogs.com/WTSRUVF/p/17366652.html

相关文章

  • 进程间通信-共享内存
    共享内存介绍共享内存是将分配的物理空间直接映射到进程的用户虚拟地址空间中,减少数据在内核空间缓存共享内存是一种效率较高的进程间通讯的方式在Linux系统中通过ipcs-m查看所有的共享内存共享内存模型共享内存创建创建共享内存调用shmget()函数函数头文件......
  • 3 - 进程 - Windows 10 - Cpython - 多进程通信 - 队列Queue _ 管道Pipe _ 共享内存Sh
    @目录一、进程通信概述:二、进程间交互对象——不用加锁1.消息队列(Queue)2.管道(Pipe)半双工三、进程间同步——需加锁,保证数据安全1.共享内存sharememory(Value、Ar......
  • Linux进程通信 | 共享内存
    一、共享内存是什么在Linux系统中,共享内存是一种IPC(进程间通信)方式,它可以让多个进程在物理内存中共享一段内存区域。这种共享内存区域被映射到多个进程的虚拟地址空间中,......
  • 证明线程确实共享内存
    实践:++xHellofromthread2Hellofromthread7Hellofromthread3Hellofromthread4Hellofromthread5Hellofromthread6Hellofromthread8Hellofrom......
  • Linux IPC(进程间通信)摘要(信号灯,共享内存,消息队列,管道)(一)
    PS:要转载请注明出处,本人版权所有。PS:这个只是基于《我自己》的理解,如果和你的原则及想法相冲突,请谅解,勿喷。前置说明  本文作为本人csdnblog的主站的备份。(BlogID......
  • Linux 多进程程序调试实例(六)-- 共享内存
    共享内存介绍共享内存就是两个不相关的进程访问同一个逻辑内存,从而达到两个进程互相通信的效果。共享内存是两个正在运行的进程之间共享和传递数据最有快的一种通信方式......
  • Linux中的管道是什么?管道与共享内存的区别有哪些?
    管道是什么?简单来说就是,一个命令的结果作为另外一个命令(结果)的输入,管道是linux提供的一种常见的进程通信工具,也是很多shell命令能够灵活组合产生强大用途的一个重要......
  • C++/python共享内存交换图片/文本信息
    共享内存保存读取图片OpenShare.cpp#include"OpenShare.h"//共享内存1,,C++发--python传递位姿与图像存储路径intkey_id=1111;intshmid;void*pBuffer;//共......
  • Windows进程通信之共享内存通信(C++)
    首先是概念:​​https://baike.baidu.com/item/%E5%85%B1%E4%BA%AB%E5%86%85%E5%AD%98/2182364?fr=aladdin​​这是比较官方的解释在我的理解,共享内存通信指的是,一个进程开......
  • C#-exe间通讯(二)-共享内存
    一、共享内存的帮助类/***┌──────────────────────────────────────────────────────────────┐*│......