共享内存同行,王明学learn

                  共享内存同行linux

1、共享内存概念函数

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

2、函数学习spa

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

2.1建立/打开共享内存blog

1).函数名 进程

  shmget ip

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、共享内存通讯

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!\n"); 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!\n"); 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\n",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 }

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

相关文章
相关标签/搜索