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