参考网址:

进程间通信——共享内存(Shared Memory)_ypt-CSDN博客_共享内存

例程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//comm.h
#ifndef _COMM_H__
#define _COMM_H__

#include<stdio.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>

#define PATHNAME "."
#define PROJ_ID 0x6666

int CreateShm(int size);
int DestroyShm(int shmid);
int GetShm(int size);
#endif
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//comm.c
#include"comm.h"

static int CommShm(int size,int flags)
{
key_t key = ftok(PATHNAME,PROJ_ID);
if(key < 0)
{
perror("ftok");
return -1;
}
int shmid = 0;
if((shmid = shmget(key,size,flags)) < 0)
{
perror("shmget");
return -2;
}
return shmid;
}
int DestroyShm(int shmid)
{
if(shmctl(shmid,IPC_RMID,NULL) < 0)
{
perror("shmctl");
return -1;
}
return 0;
}
int CreateShm(int size)
{
return CommShm(size,IPC_CREAT | IPC_EXCL | 0666);
}
int GetShm(int size)
{
return CommShm(size,IPC_CREAT);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//client.c
#include"comm.h"

int main()
{
// 获得共享内存的id
int shmid = GetShm(4096);
sleep(1);
// 将共享内存映射到本进程的地址空间
char *addr = shmat(shmid,NULL,0);
sleep(2);
int i = 0;
while(i < 26)
{
addr[i] = 'A' + i;
i++;
addr[i] = 0;
sleep(1);
}
// 将共享内存从本进程的地址空间中卸载
shmdt(addr);
sleep(2);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//server.c
#include"comm.h"

int main()
{
// 创建并获得共享内存的id
int shmid = CreateShm(4096);
// 将共享内存映射到本进程的地址空间
char *addr = shmat(shmid,NULL,0);
sleep(2);
int i = 0;
while(i++ < 26)
{
printf("client# %s\n",addr);
sleep(1);
}
// 将共享内存从本进程的地址空间中卸载
shmdt(addr);
sleep(2);
// 删除共享内存
DestroyShm(shmid);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
//Makefile
.PHONY:all
all:server client

client:client.c comm.c
gcc -o $@ $^
server:server.c comm.c
gcc -o $@ $^

.PHONY:clean
clean:
rm -f client server