Linux C 进程间的IPC通信 之 共享内存(一)
1、IPC(inter - process communication)通信
共享内存、消息队列、信号灯
2、库 <sys/shm.h>
2-1 创建共享内存
int shmget( key_t key, int size, int shmflg);
key : IPC_PRIVATE 或 ftok() 返回值
前者创建的共享内存 类似于 无名管道,只能实现 有亲缘关系 进程间的通信
例:int shmid; shmid = shmget( IPC_PRIVATE, 128, 0777);
后者创建的共享内存 类似于 有名管道,可实现 无亲缘关系 进程间的通信
size : 大小 shmflg : 权限
char ftok( const *path, char key);
例:int shmid; int key; key = ftok( "./a", 'b'); shmid = shmget( key, 128, IPC_CREAT | 0777);
2-2 通知 内核 将 共享内存 映射到 用户空间的地址中
映射到用户空间后,每次读写 共享内存 将无需 进入 内核
void *shmat( int shmid, const void *shmaddr, int shmflg);
shmflg : SHM_RDONLY 只读 默认为0 可读可写
例:char *p; p = (char *)shmat( shmid, NULL, 0);
2-3 删除用户空间中共享内存的地址映射
int shmdt( const void *shmaddr )
例:shmdt( p );
2-4 删除内核空间中共享内存
int shmctl( int shmid, int cmd, struct shmid_ds *buff);
cmd : IPC_STAT 获取对象属性 IPC_SET 设置对象属性 IPC_RMID 删除对象
例:shmctl( shmid, IPC_RMID, NULL);
2-5 读写
写 fgets( p, 128, stdin); 写到哪里去、写多少个、写什么
读 printf( "%s", p);
2-6 特点
共享内存 创建之后,一直存在于 内核 中,直到 被删除 或 系统关闭
3、命令
查看IPC: ipc -m 共享内存 -q 消息队列 -s 信号灯
例:代码 system(" ipc -m") 命令 ipc -m
删除IPC:ipcrm -m <id>
例:代码 system(" ipcrm -m shmid") 命令 ipcrm -m <id>
代码:
1 #include <stdio.h>2 #include <sys/shm.h> //共享内存3 #include <string.h> //memcpy()4 5 int main()6 {7 int shmid;8 9 int key;10 11 char *p;12 13 //创建共享内存14 //shmid = shmget(IPC_PRIVATE, 128, 0777); //参数IPC_PRIVATE创建的共享内存 类似于 无名管道15 16 key = ftok("./a",'b'); //参数:文件路径及文件名、标识符17 if(key < 0)18 {19 printf("create key failure.\n");20 return -1;21 }22 printf("key = %X\n",key);23 24 //创建共享内存25 //shmid = shmget(key, 128, 0777); //报错26 shmid = shmget(key, 128, IPC_CREAT | 0777); //参数为ftok()的返回值 创建的共享内存 类似于 有名管道27 if(shmid < 0)28 {29 printf("share memory create failure\n");30 return -1;31 }32 printf("share memory 128M, shmid = %d\n.", shmid);33 system("ipcs -m"); //查看共享内存34 //system("ipcrm -m shmid"); //报错:参数解析失败35 36 //通知内核将共享内存 映射到 用户空间的地址中37 p = (char *)shmat(shmid, NULL, 0);38 if(p < 0)39 {40 printf("shmat operation failure.\n");41 return -1;42 }43 printf("***shmat success\n");44 //写入 45 fgets(p, 128, stdin); //写入共享内存:写到哪里去、写多少个、写什么46 //读取 47 printf("share memory data: %s\n", p);48 49 shmdt(p); //删除 共享内存在用户空间的地址映射50 //memcpy(p,"abcd",4); //删除映射后,再对该地址进行操作时,段错误!51 shmctl(shmid, IPC_RMID, NULL); //删除内核空间的 共享内存52 system("ipcs -m");53 return 0;54 }
执行:
代码:通过 shmctl( shmid, IPC_RMID, NULL ); 实现 命令“ ipcrm -m <id> ” 删除内核中 共享内存 的功能
1 #include <stdio.h>2 #include <sys/shm.h>3 4 int main(int argc, char *argv[])5 {6 int shmid;7 if(argc < 3)8 {9 printf("please enter more parameter.\n");10 return -1;11 }12 if(strcmp(argv[1],"-m") != 0)13 {14 return -1;15 }16 printf("delete share memory.\n");17 shmid = atoi(argv[2]); //atoi() 字符串 转为 整型18 shmctl(shmid, IPC_RMID, NULL); //等同于 ipcrm -m <shmid>19 system("ipcs -m");20 return 0;21 }
Linux C 进程间的IPC通信 之 共享内存(一)相关推荐
- Linux C 进程间的IPC通信 之 共享内存(二)
1.父子进程(有亲缘关系)的IPC通信 int shmid; shmid = shmget(IPC_PRIVATE, 128, IPC_CREAT | 0777); //创建共享内存,参数 ...
- Linux C 进程间的IPC通信 之 消息队列(2)
Linux C 进程间的IPC通信 之 消息队列 双向通信 代码:(进程1) 1 #include <stdio.h>2 #include <sys/msg.h>3 #incl ...
- Linux C 进程间的IPC通信 之 消息队列(1)
1.消息队列 与 共享内存 1-1 消息队列 和 管道 都属于 队列结构,读完了 就被删除 不存在,但 管道 是 顺序队列 ,而 消息队列 是 链式队列 1-2 消息队列 的读和写 可设为 阻塞模 ...
- Linux C 进程间的管道通信
1.进程间的通信方式 a.管道通信:无名管道.有名管道 b.信号通信:包括信号的发送.接收和处理 c.IPC(Inter-Process Communication):共享内存.消息队列.信号灯 ** ...
- 【VxWorks系列】任务间同步与通信之共享内存
在开始之前先说明三个概念,任务间的同步,互斥,通信. 同步,是指一个任务等待某个条件发生,而另外一个任务引发这个条件后,等待的任务会被触发执行相应的处理.这就是一个任务与另一任务之间的同步控制. 互斥 ...
- Linux进程间同步和通信,linux进程间的同步方法
进程间通讯(IPC)方法主要有以下几种: 管道/FIFO/共享内存/消息队列/信号 1.管道中还有命名管道和非命名管道(即匿名管道)之分,非命名管道(即匿名管道)只能用于父子进程通讯,命名管道可用于非 ...
- linux进程间的通信(C): 共享内存
一.共享内存介绍 共享内存是三个IPC(Inter-Process Communication)机制中的一个. 它允许两个不相关的进程访问同一个逻辑内存. 共享内存是在两个正在进行的进程之间传递数据的 ...
- 【Linux】进程间通讯
前提知识 进程间具有独立性 ,现在我们要打破独立性,去通讯,所以 通讯的成本一定很高. 又时候又需要多进程协同完成某种业务内容 ,例如以前: cat file | grep "hello&q ...
- 【Linux】-- 进程间通讯
目录 进程间通讯概念的引入 意义(手段) 思维构建 进程间通信方式 管道 站在用户角度-浅度理解管道 匿名管道 pipe函数 站在文件描述符角度-深度理解管道 管道的特点总结 管道的拓展 单机版的负载 ...
最新文章
- boost::filesystem::copy用法的测试程序
- SQL:JOIN ON
- sed、head、grep、tail、EOF
- JAVA synchonized Lock类----简单总结笔记
- 经常会用到的ocr文字识别工具:Text Scanner for Mac
- Hyperledger Fabric blockchain explorer 重启
- 挖掘机液压控制系统实训QY-JXSX09
- 手机sim卡插到电脑上网_怎么用手机卡在电脑上上网
- python怎么输入正整数_python判断所输入的任意一个正整数是否为素数的两种方法...
- 有监督学习(supervised learning))与无监督学习(unsupervised learning)之间有何区别?
- word毕业论文格式排版修改
- 计算机英语四六级成绩查询,全国四六级英语成绩查询入口网址-http://cet.neea.edu.cn/cet...
- mysql将毫秒转换为小时_将毫秒转换为天小时分钟
- oracle mod函数
- 259-数据明文传输的安全问题
- 互联网医院软件|互联网医院系统开发|在线问诊提高医疗效率
- 推荐几本书给大家(二)
- Qt中LineEdit编辑框限制数字输入整理
- 如何购买服务器及域名(阿里)
- Pandas Task6——综合练习