20250901的学习笔记
一、system v
--- 共享内存信号量集
1、IPC对象操作通用框架
key值 ==> 申请 ==》读写==》关闭 ==》卸载
2、创建方式
(1)IPC_PRIVATE固定的私有键值,其值等于 0x0。一般用于有亲缘关系的进程间使用。
(2)ftok()创建临时键值。
#include <sys/types.h>
#include <sys/ipc.h>
"/etc"!
key_t ftok(const char *pathname, int proj_id);
功能:
通过该函数可以将pathname指定的路径用来以projid生成唯一的临时键值。
参数:
pathname 路径+名称
proj_id 整形的数字,一般用ASCIl码的单字符。表示与参数1的运算。
返回值:
成功 返回唯一键值
失败 -1
二、共享内存
--- 效率最高的进程间通信方式
操作流程:
key ==》申请对象==》映射对象==》读写对象==》撤销映射"==》删除对象
1、申请对象:shmget
#include <sys/ipc.h>
#include <sys/shm.h>
ps auxlgrep a.out
share memory getIPC_CREAT|0666
int shmget(key_t key, size_t size, int shmflg);
功能:
使用唯一键值key向内核提出共享内存使用申请
参数:
key 唯一键值
size 要申请的共享内存大小
shmflg 申请的共享内存访问权限,八进制表示
注:如果是第一个申请,则用IPC_CREAT;如果要检测是否存在,用IPC_EXCL。
返回值:
成功 返回共享内存id,一般用shmid表示
失败 -1
2、映射对象:shmat
void *shmat(int shmid, const void *shmaddr, int shmflg);
功能:
将指定shmid对应的共享内存映射到本地内存。
参数:
shmid 要映射的本地内存
shmaddr 本地可用的地址,如果不确定则用NULL,表示由系统自动分配。
shmflg 0,表示读写;SHM_RDONLY,只读。
返回值:
成功 返回映射的地址,一般等于shmaddr
失败 (void*)-1
3、撤销映射:shmdt
int shmdt(const void *shmaddr);
功能:
将本地内存与共享内存断开映射关系。
参数:
shmaddr 要断开的映射地址。
返回值:
成功 0
失败 -1
4、删除对象:shmctl
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
功能:
修改共享内存属性,也可以删除指定的共享内存对象。
参数:
shmid 要删除的共享内存对象
cmd IPC_RMID 删除对象的宏
buff NULL 表示只删除对象。
返回值:
成功 0
失败 -1