共享内存概念
共享内存是最快的进程间通信方式
。
解释:一旦这样的内存映射到共享它的进程的地址空间,这些进程间的数据传递不在涉及到内核,换句话说进程不再通过执行进入内核的系统调用来传递彼此的数据。
查看创建的共享内存:ipcs -m
删除共享内存段:ipcrm -M key
共享内存函数
1.创建共享内存
shmget函数
int shmget(key_t key,//共享内存段名
size_t size,//写入填申请空间的大小 打开填0
int shmflg);//创建IPC_CREAT|0644 打开填0
代码实现为:
1 #include <stdio.h>
2 #include <sys/shm.h>
3 #include <sys/ipc.h>
4 #include <stdlib.h>
5
6 int main()
7 {
8 int id=shmget(1234,sizeof(int),IPC_CREAT|0644);
9 if(id==-1)
10 perror("shmget"),exit(1);
11 }
查看是否创建:
2.删除共享内存
shmctl函数
int shmctl(int shmid, //id
int cmd,//IPC_RMID
struct shmid_ds *buf);//0
返回值:成功返回0,失败返回-1
代码实现:
1
2 #include <stdio.h>
3 #include <sys/shm.h>
4 #include <sys/ipc.h>
5 #include <stdlib.h>
6
7 int main()
8 {
9 int id=shmget(1234,0,0);//打开共享内存
10 shmctl(id,IPC_RMID,0);
11 }
3.生成key
ftok函数:
key_t ftok(const char *pathname,//必须存在的文件名
int proj_id);//低8位不能全为0
代码实现:
1 #include <sys/ipc.h>
2 #include <stdio.h>
3
4 int main( void )
5 {
6 printf("%d\n", ftok(".", 'a'));
7 }
8
结果为:
4.将共享内存挂载到自己的地址空间
shmat函数:
void *shmat(int shmid,//id
const void *shmaddr,//NULL
int shmflg);//0
返回值:挂载的虚拟地址空间起始地址,失败返回NULL
5.将共享内存段从挂载的地址空间卸载
shmdt函数:
int shmdt(const void *shmaddr);
代码实现4,5两个函数为:
write.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <sys/ipc.h>
5 #include <sys/shm.h>
6 #include <string.h>
7
8 typedef struct stu
9 {
10 int age;
11 char name[4];
12 }stu_t;
13
14 int main()
15 {
16 //创建共享内存
17 int id=shmget(1234,sizeof(stu_t),IPC_CREAT|0644);
18 if(id==-1)
19 perror("shmget"),exit(1);
20
21 stu_t *p=(stu_t*)shmat(id,NULL,0);//挂载到自己的地址空间
22 int i=1;
23 while(1)
24 {
25 p->age=i++;
26 sprintf(p->name,"%c",i%26+'a');//a=97,26个英文字母,获取每个字母
27 printf("write %d ok\n",i-1);
28 sleep(1);
29 }
30 }
read.c
lude <unistd.h>
3 #include <string.h>
4 #include <sys/ipc.h>
5 #include <sys/shm.h>
6 #include <stdlib.h>
7 typedef struct stu
8 {
9 int age;
10 char name[4];
11 }stu_t;
12
13 int main()
14 {
15 int id=shmget(1234,0,0);
16 if(id==-1)
17 perror("shmget"),exit(1);
18
19 stu_t *p=(stu_t*)shmat(id,NULL,0);
20 while(1)
21 {
22 printf("age=%d, name=%s\n",p->age,p->name);
23 }
24 }
运行两个代码如下: