一、共享内存
共享内存是最高效的通信方式,因为不需要一个进程先拷贝到内核,另一个进程在存内核中读取。
二、 ipcs -m 查看共享内存
ipcrm -m 删除共享内存
三、主要函数
shmget 创建
shmctl 删除
shmat 挂接
shmdt 取消挂接
********* man 函数名 查看*****
四、代码实现
comm.h
1 #pragma once
2 #include<stdio.h>
3 #include<stdlib.h>
4 #include<unistd.h>
5 #include<sys/ipc.h>
6 #include<sys/shm.h>
7 #define _path_ "."
8 #define _projid_ 0x666
9 #define _shm_size_ 4096
10 int getshmget();
11 int destoryshm(int shm_id);
12 char* at_shm(int shm_id);
13 int delete_shm(char *addr);
comm.c
1 #include"comm.h"
2 int getshmget()
3 {
4 key_t key=ftok(_path_,_projid_);
5
6 int shmflg=ipc_creat |0666;
7 int shm_id=shmget(key,_shm_size_,shmflg);
8 if(shm_id<0)
9 {
10 perror("shmget");
11 return -1;
12 }
13 return shm_id;
14 }
15
16 int destoryshm(int shm_id)
17 {
18 return shmctl(shm_id,ipc_rmid,null);
19 }
20
21 char* at_shm(int shm_id)
22 {
23 return (char*)shmat(shm_id,null,0);
24 }
25 int delete_shm(char *addr)
26 {
27 return shmdt(addr);
28 }
client.c
1 #include"comm.h"
2 int main()
3 {
4 int shm_id=getshmget();
5 char *addr=at_shm(shm_id);
6 int i=0;
7 for(;i<_shm_size_;i++)
8 {
9 addr[i ]='a';
10 addr[i+1]='\0';
11 sleep(1);
12 }
13 delete_shm(addr);
14 return 0;
15 }
server.c
1 #include"comm.h"
2 int main()
3 {
4 int shm_id=getshmget();
5 char * addr=at_shm(shm_id);
6 int i=0;
7 for(;i<_shm_size_;i++)
8 {
9 printf("%s\n",addr);
10 sleep(1);
11 }
12 delete_shm(addr);
13 destoryshm(shm_id);
14 return 0;
15 }
运行结果
以上就是linux --进程间通信--共享内存的内容。