共享内存有什么用?
共享内存是Linux进程间通信的一种手段,即协助进程间通信
共享内存的一般使用步骤
1.使用int shmget(ket_t key ,size_t size , int shmflg), 向系统申请共享内存,大小为size字节,并且获取进程的操作标识符,通过返回值返回。
int shmid = shmget(key , 1024 ,IPC_CREAT | 0644 );
IPC_CREAT:创建文件
0644:给文件设置用户的读写权限
shm_id :获取的共享内存空间标识符通过shmget()申请的共享内存空间不能被任何进程访问,shmat就是将该共享内存空间链接到当前进程的地址空间。2.void *shmat(int shm_id, const void *shm_addr, int shm_flg);
- shm_addr :指定共享内存连接到当前进程中的地址位置,通常为空,表示让系统来选择共享内存的地址。
- shm_flg :通常为一组标识符,通常为 0
3.int shmctl(int shm_id, int command, struct shmid_ds *buf);
- shmctl()可根据第二个参数不同来实现不同的功能,当commmand为IPC_STATE(获取标识符为shm_id的共享内存信息,并将其存储在buf中,),IPC_SET(将buf中的信息设置成,shm_id所代表的共享内存空间的信息),IPC_RMID(删除共享内存空间,buf传入NULL)
4.int shmdt(const void *shmaddr)
- 将shmaddr指向的共享内存空间与当前进程断开连接,并不是删除该共享内存空间,只是当前进程不可访问
#include <stdio.h>
#include <unistd.h>
#include <sys/shm.h>
int key=0x12345;
int main(){
//申请共享内存,
//设置共享内存大小,
//权限,
//返回值:获取共享内存句柄
int shmid = shmget(key,1024,IPC_CREAT | 0664);
if(shmid < 0){
perror("shmget\n");
return 1;
}
//创建shmid_ds buf 接收共享内存信息
struct shmid_ds buf;
//int shmctl(int shmid, int cmd, struct shmid_ds *buf);
//cmd:IPC_STAT :获取shmid共享内存空间的信息,将其存储在buf中
shmctl(shmid,IPC_STAT,&buf);
printf("shmid.size:->%ld\n",buf.shm_segsz);
//shmat:获取shmid的内存地址(将共享内存地址链接到当前程序)
//第一次创建完共享内存时,
//它还不能被任何进程访问,
//shmat()函数的作用就是用来启动对该共享内存的访问,
//并把共享内存连接到当前进程的地址空间
void* lp = shmat(shmid,NULL,0);
if(!lp){
perror("shmat\n");
return 1;
}
while(1){
sprintf((char*)lp,"%s","hello ! i am writing!\n");
sleep(1);
}
shmdt(lp);
shmctl(shmid,IPC_RMID,NULL);
return 0;
}