首页 > 其他 > 详细

共享内存通讯

时间:2016-02-28 00:44:26      阅读:363      评论:0      收藏:0      [点我收藏+]

共享内存通讯

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     struct shared_use_st *shared_stuff;
19     char buffer[TEXT_SZ];
20     //1.创建共享内存
21     shmid = shmget((key_t)1234,sizeof(struct shared_usr_st),IPC_CREAT);
22     if(1 == shmid)
23     {
24         printf("create share memory fail.\n");
25         exit(EXIT_FAILURE);
26     }
27     //2.映射共享内存
28     shared_stuff = (struct shared_use_st *)shmat(shmid, NULL , 0);
29     //3.循环
30     while(running)
31     {
32         //判断共享内存的数据是否读走
33         while(shared_stuff->written_by_you == 1)
34         {
35             sleep(1);
36             printf("wait read process!\n");
37         }
38         //3.1获取用户输入
39         fgets(buffer,TEXT_SZ,stdin);
40 
41         //3.2将用户输入的字符串放入共享内存
42         strncpy(shared_stuff->some_text,buffer,TEXT_SZ);
43         shared_stuff->written_by_you = 1;
44 
45         if(strnvmp(buffer,"end",3) == 0)
46         {
47             running = 0;
48         }
49     }
50     //4.脱离共享内存
51     shmdt((const void*)shared_stuff);
52     return 0;
53 }
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 }
share_mem_read.c

 

共享内存通讯

原文:http://www.cnblogs.com/love-linux/p/5223845.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!