文章目录
1.命名管道
2.共用存储器
3.共享内存接口
4.共享内存的标识符和共享内存的操作句柄有什么区别?
5.删除共享内存
1.命名管道
管道的名字也是内核中开辟的一段缓存区,这个缓存区是有标识符的:它意味着不同的过程不需要亲属关系,只需要通过标识符就能找到该缓存区.
创建命名管道
mkfifo[命名管道文件]p:代表的文件类型是管道文件.
功能创建
Mkfifo功能
特点
管道的生命周期也是跟随者进程的
命名管道有标识符。
的其他功能与匿名管道一致。
2.共享内存
原则
在物理内存中打开了一个空间。
物理内存的空间,可以被不同的进程附加到自己的共享区当中的这一部分
附加的进程,通过操作共享区,来交换数据
3.共享内存的接口
创建共享内存
int shmget(key_t key, size_t size, int shmflg):共享内存标识符,相当于共享内存的身份证。当程序员第一次创建它时,他可以给出任何值,只要它不复制当前操作系统中的其他共享内存标识符。key:共享内存的大小,单位:字节size:shmflg:如果共享内存不存在,创建共享内存。
IPC_CREAT:需要配合IPC_CREAT使用。当这样的宏与IPC _ CREAT一起使用时,它仍然使用按位或(核心是位图)。
IPC_EXCL:
如果您想要获取的共享内存已经存在,您将报告一个错误。如果要获取的共享内存是新创建的共享内存,则返回操作句柄。
总结:使用shmget函数时一定要使用IPC_CREAT | IPC_EXCL。
返回值:返回自己刚刚创建出来的共享内存。
共享内存命令
共享内存的操作句柄:视图共享内存
ipcs[shmid]:删除共享内存。
ipcrm -m
将共享内存附加到进程
Void shmat (int shmid,const void shmaddr,int shmflg)共享内存的共享内存的声明周期是跟随着操作系统内核的:操作句柄shmid:什么虚拟地址附加到共享内存,shmaddr,允许传递NULL值,这个地址是由这个函数的返回值返回给我们的。让操作系统帮我们选择附加到共享内存区当中的那个地址:shmflg:规定当前进程只能SHM_RDONLY共享内存。
读操作:0
返回值:返回共享内存附加到共享区域的地址。
结论:当进程读取共享内存时,可读可写
将共享内存与进程分开
int shm dt(const void * shm DDR)
shamadr:shmat的返回值
操作共享内存
Int shmtl (int shmid,int cmd,struct shmid _ ds * buf)是访问,并不是拿走!:共享内存操作句柄shmid:告诉shmctl函数做什么。
cmd:获取当前共享内存的属性信息,放入buf中,其中buf为参数。
IPC_STAT:设置共享内存的属性信息,由buf设置,buf为参数。
IPC_SET:删除共享内存,buf可以直接传递nullIPC_RMID:共享内存的结构。
4.共享内存的标识符和共享内存的操作句柄的区别是什么?
buf:它用来识别共享内存,相当于共享内存的身份证,标识符.
意味着不同的进程可以通过标识符找到这个共享内存:这个过程可以操作手柄到操作句柄.
5.删除共享内存
删除共享内存后使用对共享内存进行操作(,附加,分离,删除)或shmctl,时,ipcrm
当共享内存被释放时,共享内存就实际被释放掉了指示其他进程无法通过之前的标识符找到共享内存,共享内存的状态将被设置为共享内存的标识符会被设置为0x00000000.
当dest.