0
点赞
收藏
分享

微信扫一扫

【Linux】共享内存

彩虹_bd07 2022-03-25 阅读 79
c语言linux

共享内存是一种最为高效的进程间通信方式。因为进程可以直接读写内存,不需要任何数据复制。

共享内存的实现分为两个步骤:

1、创建共享内存——shmget(),也就是从内存中获得一段共享内存区域。

2、映射共享内存——shmat(),取消映射操作shmdt()。

shmget()

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{ 
    key_t key =  ftok(".", '!');
    if(key < 0)
    {
        perror("ftok");
    }

    //int shmid = shmget(IPC_PRIVATE, 512, 0664|IPC_CREAT);
    int shmid = shmget(key, 512, 0664|IPC_CREAT);
    if(shmid < 0)
    {
        perror("shmget");
        exit(-1);
    }
    printf("shmid = %d\n", shmid);

    return 0;
} 

 shmat()

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{ 
    key_t key =  ftok(".", '!'); //通过ftok函数得到创建或者打开共享内存的key值
    if(key < 0)
    {
        perror("ftok");
    }

    //int shmid = shmget(IPC_PRIVATE, 512, 0664|IPC_CREAT);
    int shmid = shmget(key, 512, 0664|IPC_CREAT);  //创建或者打开共享内存
    if(shmid < 0)
    {
        perror("shmget");
        exit(-1);
    }
    printf("shmid = %d\n", shmid);
    
    void *addr = shmat(shmid, NULL, 0);    //内存映射 映射的地址由系统自动分配 该地址可读可写
    if(addr == (void*)-1)
    {
        printf("shmat");
        exit(-1);
    }

    printf("addr = %p\n", addr);
    return 0;
} 

shmdt()

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{ 
    key_t key =  ftok(".", '!'); //通过ftok函数得到创建或者打开共享内存的key值
    if(key < 0)
    {
        perror("ftok");
    }

    //int shmid = shmget(IPC_PRIVATE, 512, 0664|IPC_CREAT);
    int shmid = shmget(key, 512, 0664|IPC_CREAT);  //创建或者打开共享内存
    if(shmid < 0)
    {
        perror("shmget");
        exit(-1);
    }
    printf("shmid = %d\n", shmid);
    
    void *addr = shmat(shmid, NULL, 0);    //内存映射 映射的地址由系统自动分配 该地址可读可写
    if(addr == (void*)-1)
    {
        printf("shmat");
        exit(-1);
    }

    printf("addr = %p\n", addr);
 
    int ret = shmdt(addr);
    if(ret < 0)
    {
        perror("shmdt");
        exit(-1);
    }
    return 0;
} 

 

 

举报

相关推荐

0 条评论