美文网首页
17.共享内存的操作

17.共享内存的操作

作者: 陈忠俊 | 来源:发表于2020-04-22 23:42 被阅读0次

system v IPC,通过ftok创建共享内存键值

ftok - convert a pathname and a project identifier to a System V IPC key
#include<stdio.h>
#include<sys/types.h>
#include<sys/ipc.h>

int main(int argc, char *argv[]){
    //get a system v ipc key's value
    key_t key = ftok(argv[1], 31);
    if(key == -1) return -1;
    printf("key: 0x%x\n", key);

    return 0;
}

输出:

zhongjun@eclipse:~/projects$ gcc ftok.c -o ftok
zhongjun@eclipse:~/projects$ ./ftok ftok.i
key: 0x1f02f9ff

获取共享内存段的键值:

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

int main(int argc, char *argv[]){
    //get a system v ipc key's value
    key_t key = ftok(argv[1], 31);
    if(key == -1) return -1;
    printf("key: 0x%x\n", key);

    //using current key to get the share memory segment
    int shmid = shmget(key, 1024, IPC_CREAT | IPC_EXCL | 0644);
    if(shmid == -1) return -1;
    printf("shmid: %d \n", shmid);
    return 0;
}

输出:

zhongjun@eclipse:~/projects$ gcc shmget.c -o shmget
zhongjun@eclipse:~/projects$ ./shmget ftok.i
key: 0x1f02f9ff
shmid: 163841
zhongjun@eclipse:~/projects$ ipcs -m
------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status
0x00000000 98304      lightdm    600        524288     2          dest
0x1f02f9ff 163841     zhongjun   644        1024       0

利用两个程序,交互使用共享内存段
shareA.c

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

int main(int argc, char *argv[]){
    //get a system v ipc key's value
    key_t key = ftok(argv[1], 31);
    if(key == -1) return -1;
    printf("key: 0x%x\n", key);

    //using current key to get the share memory segment
    int shmid = shmget(key, 1024, IPC_CREAT | 0644);
    if(shmid == -1) return -1;
    printf("shmid: %d \n", shmid);
    //使用共享内存段的ID,将共享内存段关联到进程的地址空间
    void *p = shmat(shmid, NULL, 0);
    if(p == (void *) -1) return -1;
    strcpy(p, "hello sky walker!\n");
    //使用完成后,释放该共享内存段
    shmdt(p);
    return 0;
}

shareB.c

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

int main(int argc, char *argv[]){
    //get a system v ipc key's value
    key_t key = ftok(argv[1], 31);
    if(key == -1) return -1;
    printf("key: 0x%x\n", key);

    //using current key to get the share memory segment
    int shmid = shmget(key, 1024, IPC_CREAT | 0644);
    if(shmid == -1) return -1;
    printf("shmid: %d \n", shmid);
    //使用共享内存段的ID,将共享内存段关联到进程的地址空间
    void *p = shmat(shmid, NULL, 0);
    if(p == (void *) -1) return -1;
    printf("%s", (char *)p);
    //使用完成后,释放该共享内存段
    shmdt(p);
    return 0;
}

输出:

zhongjun@eclipse:~/projects$ gcc shareA.c -o shareA
zhongjun@eclipse:~/projects$ gcc shareB.c -o shareB
zhongjun@eclipse:~/projects$ ./shareA ftok.i
key: 0x1f02f9ff
shmid: 163841
zhongjun@eclipse:~/projects$ ./shareB ftok.i
key: 0x1f02f9ff
shmid: 163841
hello sky walker!
zhongjun@eclipse:~/projects$

最后,通过ipcrm删除共享内存段

ipcrm -h
Options:
 -m, --shmem-id <id>        remove shared memory segment by id
 -M, --shmem-key <key>      remove shared memory segment by key

zhongjun@eclipse:~/projects$ ipcs -m

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status
0x00000000 98304      lightdm    600        524288     2          dest
0x1f02f9ff 163841     zhongjun   644        1024       0

zhongjun@eclipse:~/projects$ ipcrm -M 0x1f02f9ff
zhongjun@eclipse:~/projects$ ipcs -m

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status
0x00000000 98304      lightdm    600        524288     2          dest

相关文章

  • 17.共享内存的操作

    system v IPC,通过ftok创建共享内存键值 输出: 获取共享内存段的键值: 输出: 利用两个程序,交互...

  • 共享内存

    共享内存操作 创建共享内存: int shmget(key_t key, size_t size, int shm...

  • Java--深入理解JMM模型、Java并发特性

    上次说到Java线程并不会直接操作共享内存,而是操作共享内存的副本,这种方式称作JMM模型,描述的是Java多线程...

  • 什么是虚拟内存,分页、分段又是什么?

    操作系统——内存管理之内存分配(分页,分段,段页)多级页表与快表 共享内存可以用虚拟内存来实现。 共享内存的方式原...

  • 第二章

    Java内存模型 共享变量被各个线程操作后要回写到主内存中,如果线程AB都是对同一个共享变量进行+1操作,若在从主...

  • 进程间通信方式总结

    一、共享内存 一种常用的进程间共享方式,两个线程可以共享访问同一块内存区域,减少了数据的复制操作,因此具有速度上的...

  • 操作系统知识点

    操作系统 IPC 共享内存 管道 socket RPC romote procesure calls 同步机制 ...

  • CAS分析原理+乐悲观锁

    CAS 指的是现代 CPU 广泛支持的一种对内存中的共享数据进行操作的一种特殊指令。这个指令会对内存中的共享数据做...

  • python多进程和多线程、内存共享和进程池、多线程编程

    @[toc] 内存共享 通过Value,Array实现内存共享返回一个从共享内存上创建的ctypes对象从共享内存...

  • ThreadLocal解析

    什么是ThreadLocal 大家是否了解JMM(java内存模型),它主要是为了解决多线程下的共享内存操作问题,...

网友评论

      本文标题:17.共享内存的操作

      本文链接:https://www.haomeiwen.com/subject/hxhnihtx.html