zoukankan      html  css  js  c++  java
  • 共享内存同行,王明学learn

                      共享内存同行

    一、共享内存概念

       共享内存是IPC机制中的一种,它允许两个不相关的进程访问同一段内存, 这是传递数据的一种非常有效的方式。

    二、函数学习

      这里主要有创建共享内存、映射共享内存、分离共享内存、控制共享内存

    2.1创建/打开共享内存

    1).函数名 

      shmget 

    2).函数原型

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

    3).函数功能 

      创建或者获取共享内存,并返回描述符id 

    4).所属头文件 

      <sys/ipc.h><sys/shm.h> 

    5).返回值 

      成功:返回创建或者获取到的共享内存 

      失败:-1 

    6).参数说明

      key:共享内存的键值

       size:共享内存的大小 

      shmflg:打开标志、如果使用了IPC_CREAT,则会新创建一块共享内存 

    2.2映射共享内存 

    1).函数名 

      shmat 

    2).函数原型 

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

    3).函数功能

      把shmid指定的共享内存映射到进程的的地址空间里 

    4).所属头文件 

      <sys/types.h><sys/shm.h> 

    5).返回值 

      成功:返回映射到进程空间之后的内存地址 

      失败:-1 

    6).参数说明 

      shmid:要映射的共享内存的描述符 

      shmaddr:指定映射之后的地址,但是一般情况都让该参数为NUUL,标明让linux系统自动的选择映射地址 

      shmflg:标志 

    2.3分离共享内存 

    1).函数名 

      shmdt 

    2).函数原型

      int  shmdt(const void *shmaddr) 

    3).函数功能 

      从进程地址空间中,断掉与共享内存的联系

    4).所属头文件 

      <sys/types.h><sys/shm.h> 

    5).返回值 

      成功:0 

      失败:-1 

    6).参数说明 

      shmaddr:指明要断开共享内存的映射地址 

    2.4控制共享内存

    1).函数名 

      shmctl 

    2).函数原型 

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

    3).函数功能

      控制共享内存 

    4).所属头文件 

      <sys/ipc.h><sys/shm.h> 

    5).返回值 

      成功:根据不同的操作返回不同的值 

      失败:-1 

    6).参数说明 

      shmid:要控制的共享内存的id 

      cmd:决定执行什么样的控制操作,如使用IPC_RMID表示删除 

      buf:获取linux中描述共享内存的shmid_ds结构,基本不使用 

    三、共享内存通信

    3.1write进程主要完成创建共享内存----->映射共性内存----->脱离共享内存这几个任务 

     1 #include <sys/ipc.h>
     2 #include <sys/shm.h>  
     3 #include <sys/types.h>
     4 #include <stdio.h>
     5 #include <unistd.h>
     6 #include <stdlib.h>
     7 
     8 #define  TEXT_SIZE 2048
     9 struct shared_use_st
    10 {
    11     int written_buy_you;
    12     char some_text[TEXT_SIZE];    
    13 }; 
    14 
    15 
    16 int main()
    17 {   
    18     int running = 1;
    19     struct shared_use_st *shared_stuff; 
    20     int shmid;
    21     char buffer[TEXT_SIZE];  
    22     
    23     //1创建共享内存
    24     shmid = shmget((key_t)1234,sizeof(struct shared_use_st),IPC_CREAT);  
    25     if(shmid==-1)
    26     {
    27         printf("creat share memory fail!
    ");
    28         exit(EXIT_FAILURE);    
    29     } 
    30     
    31     //2映射共享内存
    32     shared_stuff = (struct shared_use_st*)shmat(shmid,NULL,0);
    33     
    34     //3循环 
    35     while(running)
    36     {   
    37         while(shared_stuff->written_buy_you == 1)
    38         {
    39             sleep(1);
    40             printf("wait read process!
    ");    
    41         }
    42         
    43         //获取用户输入
    44         fgets(buffer,TEXT_SIZE,stdin);
    45         
    46         //将用户输入的字符串放入共享内存
    47         strncpy(shared_stuff->some_text,buffer,TEXT_SIZE);   
    48         shared_stuff->written_buy_you = 1; 
    49         
    50         if(strncmp(buffer,"end",3)==0)
    51             running =0;
    52     }
    53         
    54      //4脱离共享内存
    55     shmdt((const void *)shared_stuff);
    56     
    57     return 1;
    58 }

    3.2read进程主要完成创建/获取共享内存------>映射共享内存-------->循环打印共享内存中的字符串----->直到结束----->脱离共享内存------>删除共享内存

     1 #include <sys/ipc.h>
     2 #include <sys/shm.h>  
     3 #include <sys/types.h>
     4 #include <stdio.h>
     5 #include <unistd.h>
     6 #include <stdlib.h>
     7 
     8 #define  TEXT_SIZE 2048
     9 struct shared_use_st
    10 {
    11     int written_buy_you;
    12     char some_text[TEXT_SIZE];    
    13 };
    14 
    15 int main()
    16 {    
    17     int shmid; 
    18     struct  shared_use_st *shared_stuff; 
    19     int running = 1;
    20     //获取共享内存
    21     shmid = shmget((key_t)1234,sizeof(struct shared_use_st),IPC_CREAT);
    22     
    23     //映射共享内存
    24     shared_stuff = (struct shared_use_st *)shmat(shmid,NULL,0);
    25     //循环
    26     while(running)
    27     {
    28         //打印共享内存
    29         if(shared_stuff->written_buy_you == 1)
    30         {
    31             printf("write process write    %s
    ",shared_stuff->some_text);
    32                shared_stuff->written_buy_you = 0;     
    33               
    34             if(strncmp(shared_stuff->some_text,"end",3)==0)
    35                 running = 0;
    36         }
    37     }
    38     //脱离共享内存
    39     shmdt((const void *)shared_stuff);
    40     
    41     //删除共享内存
    42     shmctl(shmid,IPC_RMID,0);
    43     return 0;    
    44 }

    四、编译read.c和write.c运行./read和write可以得到write打印出的字符如图所示,write输入end时候read和write进程同时结束

  • 相关阅读:
    Codeforces Round #417 C. Sagheer and Nubian Market
    linux 终端抓包命令
    计算机网络体系结构分析
    排序算法-快速排序
    排序算法-堆排序
    排序算法-希尔排序
    排序算法-插入排序
    排序算法-冒泡排序
    排序算法-选择排序
    杂谈:终端小工具
  • 原文地址:https://www.cnblogs.com/wmx-learn/p/5305059.html
Copyright © 2011-2022 走看看