共享内存通信
来源:互联网 发布:水镜先生知乎 编辑:程序博客网 时间:2024/06/05 20:22
1.基本概念
共享内存是IPC机制中的一种. 顾名思义,它允许两个不相关的进程访问同一段内存这是传递数据的一种非常有效的方式。
2.函数学习
第10类 共享内存编程
read.c:
共享内存是IPC机制中的一种. 顾名思义,它允许两个不相关的进程访问同一段内存这是传递数据的一种非常有效的方式。
2.函数学习
第10类 共享内存编程
10.1 创建/获取共享内存
10.1.1 函数名
shmget
10.1.2 函数原形
int shmget(ket_t key, size_t size, int shmflg);
10.1.3 函数功能
分配一个共享内存段,并返回其描述符
10.1.4 所属头文件
<sys/ipc.h> <sys/shm.h>
10.1.5 返回值
成功:返回创建或获取的共享内存描述符 失败:-1
10.1.6 参数说明
key:共享内存的键值
size:共享的内存大小
shmflg:打开标志,如果使用了IPC_CREAT则会新创建一块共享内存。
10.1.7 范例代码
10.2 映射共享内存
10.2.1 函数名
shmat
10.2.2 函数原形
void *shmat(int shmid, const void *shmaddr, int shmflg);
10.2.3 函数功能
映射共享内存
10.2.4 所属头文件
<sys/types.h> <sys/shm.h>
10.2.5 返回值
成功:返回映射到进程空间之后的地址 失败:(void *)-1
10.2.6 参数说明
shmid:共享内存描述符
*shmaddr:接受的内存地址,如果为NULL自动选择映射地址
shmflg:共享内存标志位
10.3 分离共享内存
10.3.1 函数名
shmdt
10.3.2 函数原形
int shmdt(const void *shmaddr);
10.3.3 函数功能
断掉进程空间中与共享内存的联系
10.3.4 所属头文件
<sys/types.h> <sys/shm.h>
10.3.5 返回值
成功:返回0 失败:-1
10.2.6 参数说明
*shmaddr:需要分离的地址
10.4 控制共享内存
10.4.1 函数名
shmctl
10.4.2 函数原形
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
10.4.3 函数功能
控制共享内存
10.4.4 所属头文件
<sys/ipc.h> <sys/shm.h>
10.4.5 返回值
成功:根据不同的操作返回不同的值 失败:-1
10.4.6 参数说明
shmid:要控制的共享内存的id
cmd: 控制操作的命令,如:IPC_RMID(表示删除)
*buf:获取linux中描述共享内存的sdmid_ds结构,(0)
3.代码编写
write.c:3.代码编写
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/sem.h>
- #include <stdio.h>
- #include <unistd.h>
- #include <stdlib.h>
- #define TEXT_SZ 2048
- struct shared_use_st
- {
- int written_by_you;
- char some_text[TEXT_SZ];
- };
- int main()
- {
- int running = 1;
- int shmid;
- struct shared_use_st *shared_stuff;
- char buffer[TEXT_SZ];
- /*创建共享内存*/
- shmid = shmget(1234 , sizeof(struct shared_use_st), IPC_CREAT);
- if(shmid == -1)
- {
- printf("creat share memory failed.\n");
- exit(EXIT_FAILURE);
- }
- /*映射共享内存*/
- shared_stuff = (struct shared_use_st *)shmat(shmid, NULL, 0);
- /*循环*/
- while(running)
- {
- while(shared_stuff->written_by_you == 1)
- {
- sleep(1);
- printf("wait read process!\n");
- }
- /*获取用户输入*/
- fgets(buffer, TEXT_SZ, stdin);
- /*把字符串放入共享内存*/
- strncpy(shared_stuff->some_text, buffer, TEXT_SZ);
- shared_stuff->written_by_you = 1;
-
- if(strncmp(buffer, "end", 3) == 0)
- running = 0;
- }
- /*脱离共享内存*/
- shmdt((const void *)shared_stuff);
- return 1;
- }
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/shm.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #define TEXT_SZ 4096
- struct shared_use_st
- {
- int written_by_you;
- char some_text[TEXT_SZ];
- };
- int main()
- {
- int shmid;
- struct shared_use_st *share_stuff;
- int running = 1;
- /*创建共享内存*/
- shmid = shmget(1234, sizeof(struct shared_use_st), IPC_CREAT);
- if(shmid == -1)
- {
- printf("creat share memory failed.\n");
- exit(EXIT_FAILURE);
- }
- /*映射共享内存*/
- share_stuff = (struct share_use_st *)shmat(shmid, NULL, 0);
- /*循环*/
- while(running)
- {
- /*打印共享内存中的字符串*/
- if(share_stuff->written_by_you == 1)
- {
- printf("write process write %s \n", share_stuff->some_text);
- share_stuff->written_by_you = 0;
-
- if(strncmp(share_stuff->some_text, "end", 3) == 0)
- running = 0;
- }
- }
- /*脱离共享内存*/
- shmdt((const void *)share_stuff);
- /*删除共享内存*/
- shmctl(shmid, IPC_RMID, 0);
- return 1;
- }
0
上一篇:信号量的互斥与同步
下一篇:消息队列编程
相关热门文章
- test123
- 编写安全代码——小心有符号数...
- 使用openssl api进行加密解密...
- 一段自己打印自己的c程序...
- 彻底搞定C语言指针详解-完整版...
给主人留下些什么吧!~~
评论热议
阅读全文
0 0
- 进程通信--共享内存
- 进程通信-共享内存 .
- linux共享内存通信
- Linux共享内存通信
- linux 共享内存通信
- 进程通信-----共享内存
- 进程通信共享内存
- linux通信-共享内存
- 进程通信----共享内存
- 共享内存通信
- 共享内存通信
- 共享内存例子-线程通信
- 进程通信之共享内存
- 共享内存应用于进程通信
- 进程通信--mmap内存共享
- 进程间通信-共享内存
- 进程间通信---共享内存
- 进程间通信--共享内存
- 静态函数库、动态链接库设置
- css技巧—图片配文字
- linux应用编程学习(6)信号
- 通过自定义属性添加样式(css+js,动态判断背景颜色)
- 信号量的互斥与同步
- 共享内存通信
- 消息队列编程
- 多线程互斥和同步
- Linux网络编程协议
- TCP/UDP socket编程学习
- vim多行增加缩进
- yii2 邮件发送教程
- 网络并发服务器设计
- 守护进程
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
买上车补票原票怎么办?
买的商务座补票怎么办
12306账号被别人登录怎么办
飞机不提供餐食怎么办
12306退票支付宝失败怎么办
12306重复支付怎么办支付宝
支付宝登的12306账号怎么办
没买儿童高铁票怎么办
网上订的机票怎么办托运
半夜买高铁票不出票怎么办
轻轨少买了一站怎么办
高铁火车票丢了怎么办
如果高铁票丢了怎么办
高铁票丢了怎么办 报销
高铁如果没赶上怎么办
高铁管家待核验怎么办
动车没有票了怎么办
12306取消订单3次怎么办
【12306取消订单3次怎么办】
火车票取消订单3次怎么办
12306收不到验证码怎么办
安逸花验证码次数限制怎么办
航班晚点导致错过转机怎么办
想去沈阳站送站怎么办
高铁没有赶上车怎么办
火车晚点赶不上下一趟车怎么办
列车晚点影响下一趟车怎么办?
高铁晚点赶不上下班车怎么办
火车在半路坏了怎么办
做火车中途坏了怎么办
员工怀孕不上班保险怎么办
怀孕带孩子不能上班保险怎么办
怀孕了不想上班保险怎么办
高铁票没票了怎么办
购买动车票无座怎么办
个税工资多报怎么办
火车晚点耽误了转车怎么办
坐火车联系不上怎么办
号码被别人注册了12306怎么办
注册12306的号码换了怎么办
12306号码被注册了怎么办