Chinaunix首页 | 论坛 | 博客
  • 博客访问: 273111
  • 博文数量: 223
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2145
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-01 10:23
个人简介

该坚持的时候坚持,该妥协的时候妥协,该放弃的时候放弃

文章分类

全部博文(223)

文章存档

2017年(56)

2016年(118)

2015年(3)

2014年(46)

我的朋友

分类: C/C++

2016-10-20 21:06:46

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 所属头文件
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 所属头文件
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 所属头文件
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 所属头文件
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. }

阅读(223) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~