共享内存

 

 

 

# 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;
}

 

posted @ 2023-05-01 16:19  WTSRUVF  阅读(25)  评论(0编辑  收藏  举报