共享内存
共享内存:是一种高效的进程通信方式,进程可以直接读写内存,而不需要任何数据拷贝(有名管道)
上面这个图,可以分两步看:
第一步:创建共享内存
第二步:建立共享内存的映射关系
下面我是实例来说明(由于水平有限,说错了见谅):
创建共享内存:用到int shmget(key_t key,int size,int shmflg);这个api,其具体信息可以查看man手册:第一个参数:主要是用于多个进程间同步机制来用的,看到代码你就会明白的,第二个参数,是你要开辟大小,第三个参数是权限(可以用于创建,详见查看man)
1 #include<stdio.h>
2 #include<sys/ipc.h>
3 #include<sys/shm.h>
4 #include<stdlib.h>
5
6 #define MAX_SIZE 4096
7
8 int main(int argc,char *argv[]) {
9 key_t key=100;
10 if(shmget(key,MAX_SIZE,0666 | IPC_CREAT) < 0 ) { //key值最好自己指定,为了方便多个进程间的通信
11 perror("creat share memory error\n");
12 exit(-1);
13 }
14
15 printf("creat successful\n");
16 exit(1);
17 }
18
创建成功后可以用ipcs -m来查看创建成功的共享内存:注意这里创建的共享内存(如果在程序中没有建立映射关系),即不能被用户程序用,也不能被内核用,因而,在创建后如果不用,要删除:-pcrm -m 共享内存标识符
对于多个进程间的通信:
用到的api有:
int shmget(key_t key,int size,int shmflg) //f返回值是共享内存的段标识符
Void * shmat(int shmid,const void *shmaddr,int shmflg); //用于获得这个实际内存在该程序中的虚拟地址(这里是一个表的关系)
Int shmdt(const void *shmaddr); //在用完了该共享内存后,删除掉映射(表)。
下面是向共享内存中写入一个数据(简单写入)
1 #include<stdio.h>
2 #include<sys/stat.h>
3 #include<sys/types.h>
4 #include<stdlib.h>
5 #include<fcntl.h>
6 #include<sys/ipc.h>
7 #define MAX_SIZE 4096
8 int main(int argc,char *argv[]) {
9 int shid;
10 char *buf;
11 if((shid = shmget(100,MAX_SIZE,0666 | IPC_CREAT)) < 0 ) {
12 perror("get shid error\n");
13 exit(-1);
14 }
15
16 buf=(char *)shmat(shid,NULL,0);
17
18 buf[0] ='y';
19 exit(0);
20
21 }
下面是从共享内存中读出:
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<sys/types.h>
4 #include<sys/stat.h>
5 #include<fcntl.h>
6 #include<sys/ipc.h>
7 #include<unistd.h>
8 #define MAX_SIZE 4096
9 int main(int argc,char *argv[]) {
10 int shid;
11 char *buf;
12 if((shid = shmget(100,MAX_SIZE,0666 | IPC_CREAT)) < 0) {
13 perror("get shid error\n");
14 exit(-1);
15 }
16
17 buf = (char *)shmat(shid,NULL,0);
18
19 write(STDOUT_FILENO,buf,1);
20 write(STDOUT_FILENO,"\n",1);
21 exit(0);
22
}