共享内存相关函数详解

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 变量以指示具体的错误类型。

  • 31
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值