共享内存通信

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

习惯就好zz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值