进程间通讯-共享内存、信号量

4.8 进程间通讯 - 共享内存 ()

  • 共享内存是将分配的物理空间直接映射到进程的⽤户虚拟地址空间中, 减少数据在内核空间缓存
  • 共享内存是⼀种效率较⾼的进程间通讯的⽅式
  • 在 Linux 系统中通过 ipcs -m 查看所有的共享内存
  • 函数头⽂件
    • #include <sys/ipc.h>
    • #include <sys/shm.h>
  • 函数原型
    • int shmget(key_t key, size_t size, int shmflg);
  • 函数功能
    • 创建⼀个共享内存, 并返回 ID
  • 函数参数
    • key : 由 ftok() 函数返回
    • size : 共享内存的⼤⼩
    • shmflg : 共享内存标志
  • 函数返回值
    • 成功 : 返回 共享内存 id
    • 失败 : 返回 -1, 并设置 errno
示例
创建⼀个共享内存, 并打印出共享内存 ID
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define PATHNAME "."
#define PRO_ID 100
#define SZ 256
int main(void)
{
    key_t key;
    int shmid,ret;
    key = ftok(PATHNAME,PRO_ID);
    if(key == -1){
        perror("[ERROR] key(): ");
        exit(EXIT_FAILURE);
}
    shmid = shmget(key,SZ,IPC_CREAT|0666);
    if(shmid == -1){
        perror("shmid(): ");
        exit(EXIT_FAILURE);
}
    printf("shmid = %d\n",shmid);
    return 0;
}
  • 函数头⽂件
    • #include <sys/ipc.h>
    • #include <sys/shm.h>
  • 函数原型
    • int shmctl(int shmid, int cmd, struct shmid_ds *buf);
  • 1.函数功能
    • 1. 共享内存控制函数, 功能由具体的功能命令字决定
  • 2. 函数参数
    • 1. shmid : 共享内存 id
    • 2. cmd : 控制命令字
      • 1. IPC_STAT: 获取 消息队列属性
      • 2. IPC_SET : 设置消息队列属性
      • 3. IPC_RMID : 删除消息队列属性 , ⽤此命名时,第三个参数为 NULL
  • 3. buf : 共享内存属性结构体指针
  • 消息队列属性结构体定义如下:
  • struct ipc_perm {
  • key_t __key; /* Key supplied to msgget(2) */
  • uid_t uid; /* Effective UID of owner */
  • gid_t gid; /* Effective GID of owner */
  • uid_t cuid; /* Effective UID of creator */
  • gid_t cgid; /* Effective GID of creator */
  • unsigned short mode; /* Permissions */
  • unsigned short __seq; /* Sequence number */
  • };
  • 函数返回值
    • 成功 : 返回 0 , 特殊命令字除外
    • 失败 : 返回 -1
示例
创建⼀个共享内存后,输出共享内存 id, 删除共享内存
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define PATHNAME "."
#define PRO_ID 100
#define SZ 256
int main(void)
{
    key_t key;
    int shmid,ret;
    k
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值