共享内存通信

来源:互联网 发布:水镜先生知乎 编辑:程序博客网 时间:2024/06/05 20:22
1.基本概念
共享内存是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:
  1. #include <sys/types.h>
  2. #include <sys/ipc.h>
  3. #include <sys/sem.h>
  4. #include <stdio.h>
  5. #include <unistd.h>
  6. #include <stdlib.h>

  7. #define TEXT_SZ 2048

  8. struct shared_use_st
  9. {
  10.     int written_by_you;
  11.     char some_text[TEXT_SZ];
  12. };

  13. int main()
  14. {
  15.     int running = 1;
  16.     int shmid;
  17.     struct shared_use_st *shared_stuff;
  18.     char buffer[TEXT_SZ];
  19.     /*创建共享内存*/
  20.     shmid = shmget(1234 , sizeof(struct shared_use_st), IPC_CREAT);
  21.     if(shmid == -1)
  22.     {
  23.         printf("creat share memory failed.\n");
  24.         exit(EXIT_FAILURE);
  25.     }

  26.     /*映射共享内存*/
  27.     shared_stuff = (struct shared_use_st *)shmat(shmid, NULL, 0);

  28.     /*循环*/
  29.     while(running)
  30.     {
  31.         while(shared_stuff->written_by_you == 1)
  32.         {
  33.             sleep(1);
  34.             printf("wait read process!\n");
  35.         }
  36.     /*获取用户输入*/
  37.         fgets(buffer, TEXT_SZ, stdin);
  38.     /*把字符串放入共享内存*/
  39.         strncpy(shared_stuff->some_text, buffer, TEXT_SZ);
  40.         shared_stuff->written_by_you = 1;
  41.        
  42.         if(strncmp(buffer, "end", 3) == 0)
  43.             running = 0;
  44.     }
  45.     /*脱离共享内存*/
  46.     shmdt((const void *)shared_stuff);

  47.     return 1;
  48. }
read.c:
  1. #include <sys/types.h>
  2. #include <sys/ipc.h>
  3. #include <sys/shm.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <unistd.h>

  7. #define TEXT_SZ 4096

  8. struct shared_use_st
  9. {
  10.     int written_by_you;
  11.     char some_text[TEXT_SZ];
  12. };

  13. int main()
  14. {
  15.     int shmid;
  16.     struct shared_use_st *share_stuff;
  17.     int running = 1;
  18.     /*创建共享内存*/
  19.     shmid = shmget(1234, sizeof(struct shared_use_st), IPC_CREAT);
  20.     if(shmid == -1)
  21.     {
  22.         printf("creat share memory failed.\n");
  23.         exit(EXIT_FAILURE);
  24.     }

  25.     /*映射共享内存*/
  26.     share_stuff = (struct share_use_st *)shmat(shmid, NULL, 0);

  27.     /*循环*/
  28.     while(running)
  29.     {
  30.     /*打印共享内存中的字符串*/
  31.         if(share_stuff->written_by_you == 1)
  32.         {
  33.             printf("write process write %s \n", share_stuff->some_text);
  34.             share_stuff->written_by_you = 0;
  35.             
  36.             if(strncmp(share_stuff->some_text, "end", 3) == 0)
  37.                 running = 0;
  38.         }
  39.     }
  40.     /*脱离共享内存*/
  41.     shmdt((const void *)share_stuff);

  42.     /*删除共享内存*/
  43.     shmctl(shmid, IPC_RMID, 0);

  44.     return 1;
  45. }

<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(64) | 评论(0) | 转发(0) |
0

上一篇:信号量的互斥与同步

下一篇:消息队列编程

相关热门文章
  • test123
  • 编写安全代码——小心有符号数...
  • 使用openssl api进行加密解密...
  • 一段自己打印自己的c程序...
  • 彻底搞定C语言指针详解-完整版...
给主人留下些什么吧!~~
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 买上车补票原票怎么办? 买的商务座补票怎么办 12306账号被别人登录怎么办 飞机不提供餐食怎么办 12306退票支付宝失败怎么办 12306重复支付怎么办支付宝 支付宝登的12306账号怎么办 没买儿童高铁票怎么办 网上订的机票怎么办托运 半夜买高铁票不出票怎么办 轻轨少买了一站怎么办 高铁火车票丢了怎么办 如果高铁票丢了怎么办 高铁票丢了怎么办 报销 高铁如果没赶上怎么办 高铁管家待核验怎么办 动车没有票了怎么办 12306取消订单3次怎么办 【12306取消订单3次怎么办】 火车票取消订单3次怎么办 12306收不到验证码怎么办 安逸花验证码次数限制怎么办 航班晚点导致错过转机怎么办 想去沈阳站送站怎么办 高铁没有赶上车怎么办 火车晚点赶不上下一趟车怎么办 列车晚点影响下一趟车怎么办? 高铁晚点赶不上下班车怎么办 火车在半路坏了怎么办 做火车中途坏了怎么办 员工怀孕不上班保险怎么办 怀孕带孩子不能上班保险怎么办 怀孕了不想上班保险怎么办 高铁票没票了怎么办 购买动车票无座怎么办 个税工资多报怎么办 火车晚点耽误了转车怎么办 坐火车联系不上怎么办 号码被别人注册了12306怎么办 注册12306的号码换了怎么办 12306号码被注册了怎么办