共享内存同行,王明学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进程同时结束

原文地址:https://www.cnblogs.com/wmx-learn/p/5305059.html