进程间通信之System V共享内存-shmget,shmat,shmdt,shmctl

前篇介绍了共享内存中mmap函数和munmap函数,下面接着学习总结System V共享内存,包括共享内存数据结构、共享内存函数、共享内存示例。

1.共享内存数据结构

2.共享内存函数

(1)shmget函数

  • 功能:用来创建共享内存
  • 原型:
    int shmget(key_t key, size_t size, int shmflg);
  • 参数:
    • key:这个共享内存段名字
    • size:共享内存大小
    • shmflg:由九个权限标志构成,它们的用法和创建文件时使用的mode模式标志是一样的
  • 返回值:成功返回一个非负整数,即该共享内存段的标识码;失败返回-1

(2)shmat函数

  • 功能:将共享内存段连接到进程地址空间
  • 原型:
    void *shmat(int shmid, const void *shmaddr, int shmflg);
  • 参数:
    • shmid:共享内存标识
    • shmaddr:指定连接的地址
    • shmflg:它的两个可能取值是SHM_RND和SHM_RDONLY
  • 返回值:成功返回一个指针,指向共享内存第一个字节;失败返回-1

其中,
1)shmaddr为NULL,内核自动选择一个地址
2)shmaddr不为NULL且shmflg无SHM_RND标记,则以shmaddr为连接地址

3)shmaddr不为NULL且shmflg设置了SHM_RND标记,则连接的地址会自动向下调整为SHMLBA的整数倍。公式:shmaddr-(shmaddr%SHMLBA)
4)shmflg=SHM_RDONLY,表示连接操作用来只读共享内存

(3)shmdt函数

  • 功能:将共享内存段与当前进程脱离
  • 原型:
    int shmdt(const void *shmaddr);
  • 参数:
    • shmaddr:由shmat所返回的指针
  • 返回值:成功返回0;失败返回-1

将共享内存段与当前进程脱离不等于删除共享内存段

(4)shmctl函数

  • 功能:用来创建和访问一个共享内存
  • 原型:
    int shmctl(int shmid, int cmd, struct shmid_ds *buf);
  • 参数:
    • shmid:由shmget返回的共享内存标识码
    • cmd:将要采取的动作,有三个可取值(与消息队列相同:IPC_STAT, IPC_SET, IPC_RMID)
    • buf:指向一个保存着共享内存的模式状态和访问权限的数据结构
  • 返回值:成功返回0;失败返回-1
3.共享内存示例

(1)写共享内存shmwrite.c

1)首先创建一块共享内存:
int shmid;
shmid = shmget(1234, sizeof(STU), IPC_CREAT|0666);

2)数据写入内存之后,进入死循环,等待quit字节写入内存…(写入之后即可跳出循环–>解除映射–>删除共享内存段)

(2)读共享内存,读完数据之后,将“quit”拷贝到共享内存中前四个字节,上述程序收到”quit”四个字节后解除映射并删除共享内存

shmread.c

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注