
Linux系统编程66 进程,线程间通信4 - 共享内存
发布日期:2021-05-07 13:26:06
浏览次数:21
分类:原创文章
本文共 2381 字,大约阅读时间需要 7 分钟。
本文学习自 李慧琴老师 的Linux系统编程
shmget() 分配一个System V共享内存段
NAME分配一个System V共享内存段 shmget - allocates a System V shared memory segmentSYNOPSIS #include <sys/ipc.h> #include <sys/shm.h>/*key:如果没有亲缘关系的进程中 创建和获取 和之前 消息队列是一样的如果在有亲缘关系的进程中,fork()之后,每一个子进程都可以拿到父进程创建的 key值,此时不再关心key值,此时可以设置为 IPC_PRIVATE,表示该IPC 为 匿名IPC 不需要ftoksize:要设置的共享内存的大小shmflg : 当前共享内存创建的特殊要求,当key 为IPC_PRIVATE时, -semflg设置为IPC_CREATshmid = shmget(IPC_PRIVATE,MEMSIZE,IPC_CREAT|0600);*/ int shmget(key_t key, size_t size, int shmflg);RETURN VALUE On success, a valid shared memory identifier is returned. On error, -1 is returned, and errno is set to indicate the error.
shmat()把共享内存映射过来
shmdt() 把共享内存进行解除映射
NAME shmat, shmdt - System V shared memory operationsSYNOPSIS #include <sys/types.h> #include <sys/shm.h>/* 把共享内存映射过来shmid:共享内存IDshmaddr :需要映射到我当前空间的具体位置,写空 表示函数帮忙在当前进程空间中寻找一块可用的内存地址。shmflg : 特殊要求,0为没有特殊要求*/ void *shmat(int shmid, const void *shmaddr, int shmflg);//把共享内存进行解除映射 int shmdt(const void *shmaddr);RETURN VALUE On success, shmat() returns the address of the attached shared memory segment; on error, (void *) -1 is returned, and errno is set to indicate the cause of the error. On success, shmdt() returns 0; on error -1 is returned, and errno is set to indicate the cause of the error.
shmctl() System V共享内存控制 如销毁
NAMESystem V共享内存控制 如销毁 shmctl - System V shared memory controlSYNOPSIS #include <sys/ipc.h> #include <sys/shm.h>/*shmid,共享内存IDcmd : 命令动作如:IPC_RMID 销毁buf,是否需要传参,需要传递的参数*/ int shmctl(int shmid, int cmd, struct shmid_ds *buf);
实验:父子进程进 使用 共享内存 进行通信,对比之前使用内存映射mmap(),还是mmap()使用更简单一点。
#include <unistd.h>#include <stdio.h>#include <stdlib.h>#include <sys/ipc.h>#include <sys/shm.h>#include <sys/types.h>#include <string.h>#include <wait.h>#define MEMSIZE 1024int main(){ int shmid; pid_t pid; char *ptr; shmid = shmget(IPC_PRIVATE,MEMSIZE,IPC_CREAT|0600); if(shmid < 0) { perror("msgget"); exit(1); } pid = fork(); if(pid < 0) { perror("fork() failed"); exit(1); } if(pid == 0) { ptr = shmat(shmid,NULL,0); if(ptr == (void *)-1) { perror("shmat"); exit(1); } strcpy(ptr,"Hello!"); shmdt(ptr); exit(0); } else { wait(NULL); ptr = shmat(shmid,NULL,0); if(ptr == (void *)-1) { perror("shmat"); exit(1); } puts(ptr); shmdt(ptr); shmctl(shmid,IPC_RMID,NULL); exit(0); } exit(0); }
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2025年04月12日 15时58分25秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
YbtOJ 递推算法课堂过关 例5 平铺方案【递推(简单DP)】
2019-03-04
YbtOJ hash和hash表课堂过关 例1 字符串哈希【hash】
2019-03-04
CSUST 2021 周赛 2 题解
2019-03-04
前后端数据交互之表单
2019-03-04
剑指offer JZ21 栈的压入弹出序列
2019-03-04
实现基于scrapy框架的天气预报爬虫hengYangSpaider @572311文
2019-03-04
Netty4服务端入门代码示例
2019-03-04
Linux系统编程44 信号 - 信号的响应过程分析!!!
2019-03-04
VL53L0x TOF激光测距的 stm32 HAL库驱动代码
2019-03-04
怎么玩LOG4J
2019-03-04
Oracle创建用户,分配表空间
2019-03-04
自定义标签(JSP2.0)简单标签
2019-03-04
MyBatis自定义类型转换器
2019-03-04
机器学习(湖北师范大学教程)-极大似然估计算法
2019-03-04
【C# 重构】—参数化查询, 需要参数,但未提供该参数
2019-03-04
决策树(二)—— ID3和C4.5
2019-03-04
MySQL~教你满分回答什么是数据库索引? 索引的数据结构是什么? 什么是事务?
2019-03-04
操作系统~进程的状态、转换、控制
2019-03-04
操作系统~线程概念以及多线程模型
2019-03-04
数据结构~缓存淘汰算法--LRU算法(Java的俩种实现方式,时间复杂度均为O(1))
2019-03-04