进程间通信(三)共享内存

概念:
共享内存区是最快的IPC形式。⼀一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再 涉及到内核,换句话说是进程不再通过执⾏行进⼊入内核的系统调⽤用来传递彼此的数据。
共享内存中的函数:

  • shmget函数:
功能:⽤用来创建共享内存 
原型    int shmget(key_t key, size_t size, int shmflg); 
参数    key:这个共享内存段名字  
        size:共享内存的大小   
	shmflg:由九个权限标志构成,它们的⽤用法和创建⽂文件时使⽤用的mode模式标志是⼀一样的 
返回值:成功返回⼀一个⾮非负整数,即该共享内存段的标识码;失败返回-1
  • shmat函数:
功能:将共享内存段连接到进程地址空间 
原型    void *shmat(int shmid, const void *shmaddr, int shmflg); 
参数    shmid: 共享内存标识    
	shmaddr:指定连接的地址    
	shmflg:它的两个可能取值是SHM_RND和SHM_RDONLY 
返回值:成功返回⼀一个指针,指向共享内存第⼀一个节;失败返回-1

说明:

shmaddr为NULL,核⼼心⾃自动选择⼀一个地址 
shmaddr不为NULL且shmflg⽆无SHM_RND标记,则以shmaddr为连接地址。 
shmaddr不为NULL且shmflg设置了SHM_RND标记,则连接的地址会⾃自动向下调整为SHMLBA的整数倍。
公式:shmaddr - (shmaddr % SHMLBA) 
shmflg=SHM_RDONLY,表⽰示连接操作⽤用来只读共享内存

  • shmdt函数:
功能:将共享内存段与当前进程脱离 
原型    int shmdt(const void *shmaddr); 
参数    shmaddr: 由shmat所返回的指针 
返回值:成功返回0;失败返回-1 
注意:将共享内存段与当前进程脱离不等于删除共享内存段

  • shmctl函数
功能:⽤用于控制共享内存 
原型    int shmctl(int shmid, int cmd, struct shmid_ds *buf); 
参数    shmid:由shmget返回的共享内存标识码    	
	cmd:将要采取的动作(有三个可取值)
	buf:指向⼀一个保存着共享内存的模式状态和访问权限的数据结构 
返回值:成功返回0;失败返回-1
命令 说明
IPC_START 把shmid_ds结构中数据设置为共享内存的当前关联值
IPC_SET 在进程由足够的权限下,把共享内存当前关联值设置为shim_ds数据结构中给出的值
IPC_RMID 删除共享内存段

猜你喜欢

转载自blog.csdn.net/weixin_40853073/article/details/82925708