1.shmget() 创建
int shmget(key_t key, size_t size, int shmflg);
参数解释:
key
:共享内存段的键(key)。它可以使用ftok
函数生成,用于唯一标识共享内存段。size
:共享内存段的大小,以字节为单位。指定要创建的共享内存段的大小。shmflg
:标志参数,用于指定共享内存段的创建和访问权限。可以使用以下标志之一或它们的组合:IPC_CREAT
:如果共享内存段不存在,则创建一个新的共享内存段。如果共享内存段已经存在,将返回其标识符。IPC_EXCL
:与IPC_CREAT
一起使用时,如果共享内存段已经存在,则返回错误。如果未指定IPC_EXCL
,则忽略已存在的共享内存段。0666
:指定共享内存段的访问权限,以八进制表示。在此示例中,0666
表示所有者、所属组和其他用户都具有读写权限。- 其他标志可以根据具体需求进行指定,例如设置读写权限、创建私有共享内存等。
返回值:
- 如果共享内存段的创建或访问成功,将返回共享内存段的标识符(ID)。
- 如果发生错误,则返回 -1,并设置
errno
变量以指示具体的错误类型。
2.shmctl() 销毁
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
参数解释:
shmid
:共享内存段的标识符(ID)。它是由shmget
函数返回的共享内存标识符。cmd
:表示要执行的操作类型。可以是以下值之一:IPC_STAT
:获取共享内存段的状态信息,并将其存储在buf
指向的struct shmid_ds
结构体中。IPC_SET
:设置共享内存段的状态信息,buf
指向一个struct shmid_ds
结构体,其中包含要设置的新值。IPC_RMID
:删除共享内存段。- 其他操作类型可以参考系统的
shmctl
文档。
buf
:指向struct shmid_ds
结构体的指针,用于存储共享内存段的状态信息或提供新的设置值。如果不需要使用该参数,则可以传递NULL
。
struct shmid_ds
结构体是用于保存共享内存段状态信息的结构体,定义如下:
struct shmid_ds {
struct ipc_perm shm_perm; // 共享内存段的权限信息
size_t shm_segsz; // 共享内存段的大小
time_t shm_atime; // 上次访问时间
time_t shm_dtime; // 上次分离时间
time_t shm_ctime; // 上次修改时间
pid_t shm_cpid; // 创建共享内存段的进程ID
pid_t shm_lpid; // 上次操作共享内存段的进程ID
unsigned short shm_nattch; // 当前附加到共享内存段的进程数量
// 其他字段根据系统而定
};
3.shmat()
将共享内存段附加到当前进程的地址空间中,以便对其进行读取和写入操作。其原型如下:
void *shmat(int shmid, const void *shmaddr, int shmflg);
参数解释:
shmid
:共享内存段的标识符(ID)。它是由shmget
函数返回的共享内存标识符。shmaddr
:指定共享内存段附加到当前进程地址空间的首选地址。通常将其设置为NULL
,表示由系统自动选择合适的地址。shmflg
:标志参数,用于指定共享内存段的附加方式和访问权限。可以使用以下标志之一或它们的组合:SHM_RDONLY
:将共享内存段以只读方式附加到进程地址空间,禁止对其进行写入操作。SHM_RND
:将shmaddr
地址向下舍入到系统页面大小的整数倍。- 其他标志可以根据具体需求进行指定。
返回值:
- 如果共享内存段附加成功,返回指向共享内存段首字节的指针。
- 如果发生错误,则返回
(void *) -1
,并设置errno
变量以指示具体的错误类型。
4.shmdt()
用于将共享内存段从当前进程的地址空间中分离,不再访问该共享内存段。其原型如下:
int shmdt(const void *shmaddr);
参数解释:
shmaddr
:指向共享内存段首字节的指针,即通过shmat
函数返回的指针。
返回值:
- 如果成功分离共享内存段,返回 0。
- 如果发生错误,返回 -1,并设置
errno
变量以指示具体的错误类型。