读数据:
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<stdlib.h>
4 #include<sys/shm.h>
5 #define IPC_KEY 0X12345678
6 int main(){
7 //创建共享内存
8 int shmid=shmget(IPC_KEY,4096,IPC_CREAT|0664);
9 if(shmid<0){
10 perror("shget error");
11 return -1;
12 }
13 //进程连接共享内存
14 void* shm_start=shmat(shmid,NULL,0);
15 if(shm_start==(void*)-1){
16 perror("shmat error");
17 return -1;
18 }
19 //演示内存操作
20 while(1){
21 printf("%s\n",(char*)shm_start);
22 sleep(2);
23 }
24 //关闭进程连接
25 shmdt(shm_start);
26 //删除共享内存
27 shmctl(shmid,IPC_RMID,NULL);
28
29 return 0;
30 }
写数据:
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<stdlib.h>
4 #include<sys/shm.h>
5 #define IPC_KEY 0X12345678
6 int main(){
7 //创建共享内存
8 int shmid=shmget(IPC_KEY,4096,IPC_CREAT|0664);
9 if(shmid<0){
10 perror("shget error");
11 return -1;
12 }
13 //进程连接共享内存
14 void* shm_start=shmat(shmid,NULL,0);
15 if(shm_start==(void*)-1){
16 perror("shmat error");
17 return -1;
18 }
19 int idx=1;
20 //演示内存操作
21 while(1){
22 sprintf(shm_start,"数字:%d\n",++idx);
23 //向字符串内格式化输入,注意每次都是写到开头元素
24 sleep(2);
25 }
26 //关闭进程连接
27 shmdt(shm_start);
28 //删除共享内存
29 shmctl(shmid,IPC_RMID,NULL);
30
31 return 0;
32 }
演示:
查看进程通信:
注意:
1.共享内存不存在互斥和同步.
2.共享内存生命周期随内核,即:我们ctrl+c退出上面的程序,由于死循环while(1),下次read运行程序内容为上次遗留的内容。