共享内存同行,王明学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!\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 }
四、编译read.c和write.c运行./read和write可以得到write打印出的字符如图所示,write输入end时候read和write进程同时结束