共享内存通讯
共享内存通讯
10.1 创建/获取共享内存
10.1.1 函数名
shmget
10.1.2 函数原形
Int shmget(key_t key,size_t size,int shmflg)
10.1.3 函数功能
创建或者获取共享内存,并返回其描述符ID
10.1.4 所属头文件
<sys/ipc.h>
<sys/shm.h>
10.1.5 返回值
成功:返回创建或则获取到的共享内存的描述符
失败:-1
10.1.6 参数说明
Key:共享内存的键值
Size:共享内存的大小
Shmflg:打开标志,如果使用了IPC_CREAT,则会新创建一块共享内存
10.2 映射共享内存
10.2.1 函数名
shmat
10.2.2 函数原形
Void *shmat(int shmid,const void *shmaddr,int shmflg)
10.2.3 函数功能
把shmid指定的共享内存映射到进程的地址空间里
10.2.4 所属头文件
<sys/types.h>
<sys/shm.h>
10.2.5 返回值
成功:返回映射到进程空间之后的内存地址
失败:-1
10.2.6 参数说明
Shmid:要映射的共享内存的描述符
Shmaddr:指定映射之后的地址,但是一般情况都让该参数为NULL,表明让linux系统自动的选择映射地址
Shmflg:打开标志,如果使用了IPC_CREAT,则会新创建一块共享内存
10.3 脱离共享内存
10.3.1 函数名
shmdt
10.3.2 函数原形
int shmdt(const void *shmaddr)
10.3.3 函数功能
从进程地址空间中断掉与共享内存的联系
10.3.4 所属头文件
<sys/types.h>
<sys/shm.h>
10.3.5 返回值
成功:1
失败:-1
10.3.6 参数说明
Shmaddr:要断开的共享内存的映射地址
10.4 删除共享内存
10.4.1 函数名
shmctl
10.4.2 函数原形
Int shmctl(int shmid,int cmd,struct shmid_ds *buf)
10.4.3 函数功能
控制共享内存
10.4.4 所属头文件
<sys/ipc.h>
<sys/shm.h>
10.4.5 返回值
成功:根据不同的操作返回不同的值
失败:-1
10.4.6 参数说明
Shmid:要控制的共享内存的id
Cmd:决定执行什么样的控制操作,如IPC_RMID(表示删除)
Buf:获取linux中描述共享内存的shmid_ds结构,基本不使用
例程:
share_mem_write.c
1 #include <stdio.h> 2 #include <sys/types.h> 3 #include <sys/shm.h> 4 #include <sys/ipc.h> 5 #include <unistd.h> 6 #include <stdlib.h> 7 8 #define TEXT_SZ 2048 9 struct shared_use_st 10 { 11 int written_by_you; 12 char some_text[TEXT_SZ]; 13 }; 14 15 int main() 16 { 17 int shmid; 18 int running = 1; 19 struct shared_use_st *shared_stuff; 20 char buffer[TEXT_SZ]; 21 //1.创建共享内存 22 shmid = shmget((key_t)1234,sizeof(struct shared_use_st),IPC_CREAT); 23 if(1 == shmid) 24 { 25 printf("create share memory fail.\n"); 26 exit(EXIT_FAILURE); 27 } 28 //2.映射共享内存 29 shared_stuff = (struct shared_use_st *)shmat(shmid, NULL , 0); 30 //3.循环 31 while(running) 32 { 33 //判断共享内存的数据是否读走 34 while(shared_stuff->written_by_you == 1) 35 { 36 sleep(1); 37 printf("wait read process!\n"); 38 } 39 //3.1获取用户输入 40 fgets(buffer,TEXT_SZ,stdin); 41 42 //3.2将用户输入的字符串放入共享内存 43 strncpy(shared_stuff->some_text,buffer,TEXT_SZ); 44 shared_stuff->written_by_you = 1; 45 46 if(strncmp(buffer,"end",3) == 0) 47 { 48 running = 0; 49 } 50 } 51 //4.脱离共享内存 52 shmdt((const void*)shared_stuff); 53 return 0; 54 } 55 56 share_mem_write.c
share_mem_read.c
1 #include <stdio.h> 2 #include <sys/types.h> 3 #include <sys/shm.h> 4 #include <sys/ipc.h> 5 #include <unistd.h> 6 #include <stdlib.h> 7 8 #define TEXT_SZ 2048 9 struct shared_use_st 10 { 11 int written_by_you; 12 char some_text[TEXT_SZ]; 13 14 }; 15 int main() 16 { 17 int shmid; 18 int running =1; 19 struct shared_use_st *shared_stuff; 20 //1.创建/获取共享内存 21 shmid = shmget((key_t)1234,sizeof(struct shared_use_st),IPC_CREAT); 22 23 //2.映射共享内存 24 shared_stuff = (struct shared_use_st *)shmat(shmid,NULL,0); 25 26 //3.循环 27 while(running) 28 { 29 //打印共享内存 30 if(shared_stuff->written_by_you == 1) 31 { 32 printf("write process write %s\n",shared_stuff->some_text); 33 shared_stuff->written_by_you = 0; 34 if(strncmp(shared_stuff->some_text,"end",3) == 0) 35 { 36 running = 0; 37 } 38 } 39 } 40 //4.脱离共享内存 41 shmdt((const void *)shared_stuff); 42 43 //5.删除共享内存 44 shmctl(shmid,IPC_RMID,0); 45 return 1; 46 } 47 48 share_mem_read.c