linux shmget ftok shmat shmdt shmctl函数
这里写目录标题
- 一 上一节的回顾
- 二 上一节的补充
- 三 ftok shmget 函数配合生成的key值
- 四 shmat 函数
- 共享内存映射到用户态的根据
- 五 shmdt函数
- 六 shmctl函数
- 1 shmctl函数的使用第一种方法
- 2 shmctl函数的使用第二种方法
- 3 不使用shmctl函数第三种方法
一 上一节的回顾
用 shmget 函数 创建了 共享内存
用 icps -m xxx 删除了指定的内存
二 上一节的补充
删除的是映射 为什么不是内核呢
映射的过程
相当于 内核的东西换了一个位置 输出 方便用户使用
节省了资源 删除也方便。
三 ftok shmget 函数配合生成的key值
name :文件名
int proj id :随机数字 (随意填1-65535)
key 为 ftok 的返回值
size :字节大小
shmflg:文件权限
#include<sys/shm.h>
#include<sys/types.h>
#include<stdio.h>
#include <sys/ipc.h>
#include<sys/msg.h>int main(){int res;int key;key=ftok("key.c",1);if(key<0)//出错 {printf("error");perror("why");}printf("ftok is sueecss ID is %d\n",key);res=shmget(key,128,IPC_CREAT|0777);if(res==-1)//出错 {printf("error\n");perror("***why:");return -2;}printf("shmget is sueecss ID is %d\n",res);return 0;}
生成的id 都是固定的 方便血缘关系的通信 (固定概念)
四 shmat 函数
这个函数用下面的 关系图 就可以解释和证明他的用处了
1 以前 我们在用户态写缓存 满足 条件之后 是往 内核里面的 但是现在不用了
因为内核映射出了一个地址到了 用户态
2 用户态的进程组 直接调用系统函数 对映射操作
#include<sys/shm.h>
#include<sys/types.h>
#include<stdio.h>
#include <sys/ipc.h>
#include<sys/msg.h>
#include<stdlib.h>
#include <string.h>int main(){int res;int key;char *p=(char*)malloc(1024);key=ftok("key.c",1);if(key<0){printf("error");perror("why");}printf("ftok is sueecss ID is %d\n",key);res=shmget(key,128,IPC_CREAT|0777);if(res==-1){printf("error\n");perror("***why:");return -2;}printf("shmget is sueecss ID is %d\n",res);p = (char *)shmat(res,(void *)NULL,0);if(p==NULL){printf("shamt is error\n");perror("why");return -5;}printf("sueecss\n");fgets(p,128,stdin);//输入printf("fgets is %s\n",p);//输出return 0;}
id :为shmget函数返回值
NULL:自动完成映射
0:可读写
如果是在读一次呢
#include<sys/shm.h>
#include<sys/types.h>
#include<stdio.h>
#include <sys/ipc.h>
#include<sys/msg.h>int main(){int res;int key;char *p;key=ftok("key.c",1);if(key<0){printf("error");perror("why");}printf("ftok is sueecss ID is %d\n",key);res=shmget(key,128,IPC_CREAT|0777);if(res==-1){printf("error\n");perror("***why:");return -2;}printf("shmget is sueecss ID is %d\n",res);p = (char *)shmat(res,(void *)NULL,0);if(p==NULL){printf("shamt is error\n");perror("why");return -5;}printf("sueecss\n");fgets(p,128,stdin);//输入printf("one fgets is %s\n",p);//输出printf("two fgets is %s\n",p);//输出 return 0;}
能输出的原因
1 在创建的时候 会一直存在内核中 直到被删除或者系统关闭
2 共享内存和管道不一样 读取之后 内容不会消失
共享内存映射到用户态的根据
假设1
1 写一个printf("hello\n"); : 写满缓存它会进入内核态 然后输出
看看结束的形式
换行就结束了
共享内存的情况 (不进入内核态)
以空行结束
五 shmdt函数
函数指针可以存放指针
删除映射部分
实验证明
删除映射部分 之后 在读取 如果 出现段错误 证明删除成功
#include<sys/shm.h>
#include<sys/types.h>
#include<stdio.h>
#include <sys/ipc.h>
#include<sys/msg.h>int main(){int res;int key;char *p;key=ftok("key.c",1);if(key<0){printf("error");perror("why");}printf("ftok is sueecss ID is %d\n",key);res=shmget(key,128,IPC_CREAT|0777);if(res==-1){printf("error\n");perror("***why:");return -2;}printf("shmget is sueecss ID is %d\n",res);p = (char *)shmat(res,(void *)NULL,0);if(p==NULL){printf("shamt is error\n");perror("why");return -5;}printf("sueecss\n");fgets(p,128,stdin);//输入printf("one fgets is %s\n",p);//输出printf("two fgets is %s\n",p);//输出 shmdt((void*)p);//删除printf("fgets is %s\n",p);//输出 return 0;}
六 shmctl函数
主要看 第二个参数
删除指令 IPC_RMID 调用函数可以有两种方法实现删除命令 加上 icprm -m xxx (无需调用函数的 )一共三种
1 shmctl函数的使用第一种方法
参数配置
id:shmget返回值
command:IPC_RMID
buf :不指定 (NULL)
#include<sys/shm.h>
#include<sys/types.h>
#include<stdio.h>
#include <sys/ipc.h>
#include<sys/msg.h>
#include<string.h>int main(){int cv;int res;int key;char *p;key=ftok("key.c",1);if(key<0){printf("error");perror("why");}printf("ftok is sueecss ID is %d\n",key);res=shmget(key,128,IPC_CREAT|0777);if(res==-1){printf("error\n");perror("***why:");return -2;}printf("shmget is sueecss ID is %d\n",res);p = (char *)shmat(res,(void *)NULL,0);if(p==NULL){printf("shamt is error\n");perror("why");return -5;}printf("sueecss\n");fgets(p,128,stdin);//输入printf("one fgets is %s\n",p);//输出printf("two fgets is %s\n",p);//输出 shmdt(p);//删除cv=shmctl(res,IPC_RMID,NULL); if(cv==-1){printf("error\n");perror("!!why:");return -2;}printf("shmctl is sueecss ID is %d\n"); return 0;}
生成了它,查看不到 所以 删除成功
2 shmctl函数的使用第二种方法
使用main的形参实现
strmpy 字符串对比函数
参数 :一样的类型
0:就是相同
否则不同
#include<sys/shm.h>
#include<sys/types.h>
#include<stdio.h>
#include <sys/ipc.h>
#include<sys/msg.h>
#include <string.h>int main(int argc,char *argv[]){int shmid;int res;char *p;if(argc<2){printf("argc is error");return -2;}if(strcmp(argv[1],"-m")==0){printf("two can is sueecss\n");}shmid=ator(argv[2]);p= (char *)shmat(shmid,(void *)NULL,0);fgets(p,128,stdin);res=shmctl(shmid,IPC_RMID,NULL);if(res==-1){printf("shmctl is error\n");perror("why");retun -100;}printf("shmctl is sueecss\n");return 0;}
./a.out :argv[0]
-m : argv[1]
xxx:argv[2]
3 不使用shmctl函数第三种方法
方法 3 :ipcrm -m xxx
删除了 就不存在了
师从哞哞队长
入门小白 多多指教
linux shmget ftok shmat shmdt shmctl函数相关推荐
- Linux 3.进程间通信(shmget shmat shmdt shmctl 共享内存、signal signaction sigqueue 信号、semget semctl semop 信号量)
Linux 3.进程间通信(IPC) 共享内存 共享内存的接口指令 shmget 创建获取获取共享内存 shmat 映射:连接共享内存到当前进程的地址空间 shmdt 断开与共享内存的连接 shmct ...
- 共享内存(shmget,shmat,shmdt,shmctl)
共享内存shmgetshmatshmdtshmctl shmget int shmget(key_t key, size_t size, int flag); key: 标识符的规则 size:共享存 ...
- 李治军老师操作系统实验6----地址映射与共享-共享内存函数(shmget、shmat、shmctl)
本文参考https://blog.csdn.net/laoshuyudaohou/article/details/103843023 一.实验目标 深入理解操作系统的段.页式内存管理,深入理解段表.页 ...
- Linux进程间通信:共享内存函数(shmget、shmat、shmdt、shmctl)及其范例
共享内存函数由shmget.shmat.shmdt.shmctl四个函数组成.下面的表格列出了这四个函数的函数原型及其具体说明. 1. shmget函数原型 shmget(得到一个共享内存标识符或 ...
- c语言中shmget相关函数,共享内存函数(shmget、shmat、shmdt、shmctl)及其范例 - guoping16的专栏 - 博客频道 - CSDN...
2014年4月2日共享内存函数(shmget.shmat.shmdt.shmctl)及其范例 - guoping16的专栏 - 博客频道 - http://doc.xuehai.net 登录 | 注册 ...
- 共享内存函数(shmget、shmat、shmdt、shmctl)
一:shmget函数:得到一个共享内存标识符或创建一个共享内存对象 1,头文件: #include <sys/ipc.h>#include <sys/shm.h> 2,函数说明 ...
- shmget物理内存_Linux进程间通信(六):共享内存 shmget()、shmat()、shmdt()、shmctl()...
下面将讲解进程间通信的另一种方式,使用共享内存. 一.什么是共享内存 顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式 ...
- Linux共享内存二维数组,linux系统编程--shmget shmat shmdt
要使用共享内存,应该有如下步骤: 1.开辟一块共享内存 shmget() 2.允许本进程使用共某块共享内存 shmat() 3.写入/读出 4.禁止本进程使用这块共享内存 shmdt() 5.删除这块 ...
- Linux进程间通信(七)---共享内存之shmget()、shmat()、shmdt()及其基础实验
/********************************************************************* * 2019年6月26日声明:本博客资源下载积分最开始为免 ...
最新文章
- WAF Bypass数据库特性(Mysql探索篇)
- Spark SQL Catalyst源代码分析Optimizer
- vue脚手架---vue-cli
- linux自动运行python脚本,执行脚本如何在linux环境下自启动
- IOS开发入门环境搭建输出helloworld
- mysql连接服务密码_Hydra爆破常见服务密码
- SAP License:SAP顾问如何写运维报告
- Android UI开发第三十九篇——Tab界面实现汇总及比较
- HTTP响应码及其含义
- 泛函编程(7)-数据结构-List-折叠算法
- linux系统,清理缓冲池内存
- SaveIG什么意思--Instagram图片下载最佳途径,
- 什么是OBD及组成和作用、工作原理
- 小学生体测测试环境怎么填_小学体测在各个学校展开 最新六年级测试项目及评价标准表一览...
- 正斜杠(/)与反斜杠(\)总结
- 全国车牌归属地对应表 - sqlserver
- 传统语音识别介绍【一】—— 前端处理
- 全球数字高程数据:ASTER GDEM
- 英语练习32 Poor Amy
- python 统计组合用什么库_Python数据分析之双色球统计两个红和蓝球哪组合比例高的方法...