共享内存通讯

共享内存通讯

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.
");
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!
");
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
",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
原文地址:https://www.cnblogs.com/love-linux/p/5223845.html