进程间通信,效率最高的就是共享内存。进程退出时,对共享内存毫无影响。
1.基础操作
1.1.创建共享内存
1.2.进程和共享内存关联
1.3.进程与共享内存分离
1.4.删除共享内存
2.示例
3.
1.基础操作
1.1.创建共享内存 shmget
1.2.进程和共享内存关联shmat
1.3.进程与共享内存分离shmdt
1.4.删除共享内存shmctl
1.1.shmget
int shmget(key_t key,size_t,size,int shmflg);
key:记录共享内存在内核中的位置 key>0的整数
size: 内存大小 如果是打开,size=0
shmflg:IPC_CREAT|IPC_EXCL 是否存在
IPC_CREAT| 0664 一个权限
返回值:-1 失败
//示例:
int shmid=shmget(100,4096,IPC_CREAT|0664);//创建
int shmid=shmget(100,4096,IPC_CREAT|0664);//打开
int shmid=shmget(100,0,0); //打开
1.2.关联 shmat
函数定义与调用
void *shmat(int shmid,const void *shmaddr,int shmflg);
shmid: shmget()函数的返回值
shmaddr: NULL->委托内核区指定
shmflg: 0为读写
成功:地址
失败:-1
void *ptr=shmat(shmid,NULL,0)//函数的调用
memcpy(ptr,"***",len); //写内存
printf("%s",(char*)ptr); //读内存
1.3.分离 shmdt
int shmdt(const void*shaddr):
成功:0
失败:-1
1.4.删除shmctl
//fcntl
//setsockopt
//getsockopt
int shmctl(int shmid,int cmd,stuct shmid_ds *buf);
shmid:通过这个参数访问共享内存 shmget() 函数的返回值
cmd:IPC_STAT: 获取状态
IPC_SET: 设置状态
IPC_RMID:标记
buf:
cmd==IPC_STAT:传入
cmd==IPC_SET: 传出
cmd==IPC_RMID:指定为NULL
shmctl(shmid,IPC_RMID,NULL)
2.示例
#include<>
#include<sys/ipc.h>
#include<sys/shm.h>
//write_shm.c gcc write_shm.c -o write
int main_write()
{
//1.创建或者打开
int shmid=shmget(100,4096,IPC_CREAT|0664);
//2.关联
void *ptr=shmat(shmid,NULL,0);
//3.写共享内存
const char* pt="这是一块共享内存---";
memcpy(ptr,pt,strlen(pt)+1);
printf("按任意键继续\n");
getchar();
//4.解除关联
shmdt(ptr);
//5.删除共享内存
shmctl(shmid,IPC_RMID,NULL);
return 0;
}
//read_shm.c gcc read_shm.c -o read
int main_read()
{
//1.打开
int shmid=shmget(100,0,0);
//2.关联
void *ptr=shmat(shmid,NULL,0);
//3.读共享内存
printf("%s\n",(char*)ptr);
printf("按任意键继续\n");
getchar();
//4.解除关联
shmdt(ptr);
//5.删除共享内存
shmctl(shmid,IPC_RMID,NULL);
return 0;
}
3.注意事项
3.1多少个进程在访问这个共享内存 struct shmid_ds :shm_nattch
3.2可以多次删除
3.3共享内存操作命令