Chinaunix首页 | 论坛 | 博客
  • 博客访问: 83080
  • 博文数量: 18
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 85
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-18 09:53
文章分类
文章存档

2015年(18)

我的朋友

分类: LINUX

2015-05-15 15:24:02

1共享内存:
是linux IPC中是最快的进程间通信方式,粗略理解就是系统为两个进程提供一个可以访问的同一地址空间,进行通信,但必然带来对其访问的一些控制问题,所以需要和信号量等配合使用。涉及到的api如下:
1 key_t ftok(char *pathname, int prj_id);//获取key值

2 int shmget(key_t key, size_t size, int shmflg);//获取/创建共享内存id

void *shmat(int shmid, const void *shmaddr, int shmflg)//通过id获取共享内存地址,与共享内存关联,之后才允许访问。
第二个参数的地址是可以指定的共享内存地址,通常让系统指定,我们不关心,设为NULL

4 int shmctl(int shmid, int command, struct shmidds *buf);
其中command//仅说明通用的,linux特有的没管
IPC_STAT:获取共享内存的当前信息,存储在buf中
IPC_SET:设置共享内存buf中的 部分信息
IPC_RMID:给共享内存加个标志,在所有进程与共享内存分离后删除之,需要创建该共享内存的成员或者有权限者

5 int shmdt(const void *shmaddr);//将共享内存从当前进程中分离,不删除共享内存,只是当前进程不可用了

测试代码如下://所有测试需要自己创建下ftok()的filename,即获取key值所需的/tmp/下的文件

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <sys/ipc.h>
  3. #include <unistd.h>
  4. #include <sys/shm.h>

  5. #define SHM_SIZE 256

  6. void *init_shm(char *pathname)//两个进程公用的代码
  7. {
  8.     int id;
  9.     key_t key;
  10.     void *addr;

  11.     key = ftok(pathname, 1);//通过文件获取key值
  12.     if (key < 0) {
  13.         perror("ftok()");
  14.     }

  15.     id = shmget(key, SHM_SIZE, IPC_CREAT | 0600);//创建shmem,注意要给权限
  16.     if (id < 0) {
  17.         perror("shmget()");
  18.     }

  19.     addr = shmat(id, NULL, 0);//关联shmem,通过id得到我们操作的共享内存首地址,才可用
  20.     if (addr == ((void *)-1)) {
  21.         perror("shmat()");
  22.     }

  23.     return addr;
  24. }

  25. int main(int argc, char **argv)
  26. {
  27.     pid_t pid;

  28.     if ((pid = fork()) < 0) {
  29.         perror("fork");
  30.     } else if (pid == 0) { // child
  31.         char *str1 = init_shm("/tmp/1");
  32.         sprintf(str1, "hello i write onece here");//向共享内存中写数据,和操作自己的空间没区别
  33.     } else { // parent
  34.         char *str = init_shm("/tmp/1");
  35.         sleep(1);//让子进程写完,因为没加控制访问的部分(参见我写的信号量简单例子)
  36.         printf("i get :\" %s\"\n", str);//读取共享内存中的数据,确认两个进程都可以访问
  37.     }
  38.     return 0;
  39. }



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