面试题答案
一键面试- 创建共享内存函数:
shmget
- 函数作用:创建一个新的共享内存段或获取一个已存在的共享内存段标识符。
- 函数原型:
int shmget(key_t key, size_t size, int shmflg);
- 参数含义:
key
:是一个key_t
类型的键值,用于标识共享内存段。通常使用ftok
函数生成,这个值在系统范围内唯一标识共享内存段。如果key
为IPC_PRIVATE
,则创建一个私有的共享内存段,只有创建者和其子孙进程能访问。size
:指定共享内存段的大小,以字节为单位。如果创建新的共享内存段,这个值必须大于0;如果获取已存在的共享内存段,这个值可以为0。shmflg
:是一组标志位,用于指定共享内存段的创建方式和访问权限。它由9位权限掩码(同文件权限设置,如0666
)和一些可选的标志(如IPC_CREAT
表示如果共享内存段不存在则创建,IPC_EXCL
与IPC_CREAT
一起使用,若共享内存段已存在则返回错误)组成。
- 映射共享内存函数:
shmat
- 函数作用:将共享内存段连接到调用进程的地址空间。
- 函数原型:
void *shmat(int shmid, const void *shmaddr, int shmflg);
- 参数含义:
shmid
:是共享内存段的标识符,由shmget
函数返回。shmaddr
:指定映射的地址。如果为NULL
,系统会自动选择一个合适的地址;如果不为NULL
,且shmflg
中没有指定SHM_REMAP
,则系统会尽量将共享内存段映射到该地址。shmflg
:标志位,用于指定映射的方式。SHM_RDONLY
表示以只读方式映射,默认是以读写方式映射。
- 解除映射共享内存函数:
shmdt
- 函数作用:将共享内存段从调用进程的地址空间分离。
- 函数原型:
int shmdt(const void *shmaddr);
- 参数含义:
shmaddr
:是共享内存段在调用进程地址空间中的起始地址,即shmat
函数返回的地址。成功解除映射后,该地址不再能被进程访问。