zoukankan      html  css  js  c++  java
  • 共享内存

          共享内存机制是3个IPC机制的第二个,它允许两个不同的进程访问同一块逻辑内存,共享内存是在两个正在运行的进程之间传递数据的一种非常有效的方式:

        头文件:

          #include <sys/shm.h>

        主要函数:

          int shmget(key_t key, size_t size, int shmflg);

          //得到共享内存的标识号

          void *shmat(int shmid, const void *shmaddr, int shmflg);

          //获得内存标示号对应的共享地址

          void *shmat(int shmid, const void *shmaddr, int shmflg);

          //解除对应标识号的关联 

          int shmctl(int shmid, int cmd, struct shmid_ds *buf);

          //删除对应内存标识号的共享物理地址

          接下来是代码:申请一块共享的内存,往内存里面写数据:

          

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <string.h>
      4 #include <signal.h>
      5 #include <fcntl.h>
      6 #include <sys/ipc.h>
      7 #include <sys/msg.h>
      8 #include <sys/shm.h>
      9 
     10 
     11 int main()
     12 {
     13     //得到共享内存标识符
     14     int ret;
     15     ret=shmget(IPC_PRIVATE ,1,IPC_CREAT);
     16     if(ret < 0)
     17     {
     18         perror("shmget!
    ");
     19         exit(EXIT_FAILURE);
     20     }
     21     printf("ret is %d
    ",ret);
     22     //3342380
     23     //得到共享地址
     24     char *shm_addr =(char*)shmat(ret,NULL,0);
     25     printf("shm_addr is %p
    ",shm_addr);
     26     if(shm_addr ==(char*)-1)
     27     {
     28         perror("shm_addr error!
    ");
     29         exit(EXIT_FAILURE);
     30     }
     31 
     32     char *buf="hello shmaddr!
    ";
     33     //向共享地址写数据
     34     strcpy(shm_addr,buf);
     35 
     36     shmdt(shm_addr);
     37 }
     38 
     39 
     40 
     41 

        读: read

        

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <string.h>
      4 #include <signal.h>
      5 #include <fcntl.h>
      6 #include <sys/ipc.h>
      7 #include <sys/msg.h>
      8 #include <sys/shm.h>
      9 
     10 int main()
     11 {
     12 #if 0
     13     int ret;    
     14     ret=shmget(IPC_PRIVATE , 1,IPC_CREAT);
     15     if(ret < 0)
     16     {
     17         perror("shmget!
    ");
     18         exit(EXIT_FAILURE);
     19     }
     20     printf("ret is %d
    ",ret);
     21     //3342380
     22 #endif
     23     //得到共享内存的地址
     24     char *shm_addr =(char*)shmat(3375149,NULL,0);
     25     printf("shm_addr is %p
    ",shm_addr);
     26     if(shm_addr ==(char*)-1)
     27     {
     28         perror("shm_addr error!
    ");
     29         exit(EXIT_FAILURE);
     30     }
     31 
     32     //char *buf="hello shmaddr!
    ";
     33     //从共享内存 里读数据
     34     char buf[1024];
     35     strcpy(buf,shm_addr);
     36     printf("buf is %s
    ",buf);
     37 
     38     shmdt(shm_addr);
     39     //解除关联
     40     //
     41     if(shmctl(3375149,IPC_RMID,0)==-1)
     42     //删除共享内存地址
     43     {
     44         perror("shmctl!
    ");
     45         exit(EXIT_FAILURE);
     46     }
     47         exit(EXIT_SUCCESS);
     48 }
     49 
     50 
     51 
     52 
     53 
    ~                    

        

      运行结果:

        

      通过  ipcs -m可以查看相关的共享内存的情况:

          

                

        

          

          

  • 相关阅读:
    jekins 实现Django项目的自动部署(ubuntu16.04,python2.7,django1.11)
    Ubuntu16.04 安装 Django
    小米笔记本 air 12.5寸 支持硬盘参数
    editplus5激活码
    jmeter UDV
    c语言 快速排序
    html禁止文本输入框记录输入记录,单击input出现输入过的记录
    python pstats ,profile 性能分析
    python profile性能分析
    python 获取本地语言和编码的代码
  • 原文地址:https://www.cnblogs.com/hongzhunzhun/p/4570100.html
Copyright © 2011-2022 走看看