美文网首页
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.共享内存的操作

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