Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103180
  • 博文数量: 32
  • 博客积分: 230
  • 博客等级: 二等列兵
  • 技术积分: 183
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-19 11:30
文章分类
文章存档

2014年(18)

2013年(8)

2012年(6)

我的朋友

分类: LINUX

2014-01-15 22:36:41

共享内存:
     它是内存数据传递速度最快的,所以在很多时候都会用到共享内存的通信机制。

1,获得key值
ftok(argv[1],'k'))

2,创建共享内存获得ID;
shm_id = shmget(key,1024,IPC_CREAT | 0666))

3,映射共享内存
 shmat(shm_id,NULL,0)  

4,解除映射
shmdt(add);

5,删除共享内存add
shmctl(shmid,cmd,NULL)

下面来实现两个进程对一个共享内存的数据交换:

read.c中代码如下

#include
#include
#include
#include
#include
#include

void handler_signal(int signum)
{
 return;
}

//./a.out .
int main(int argc, const char *argv[])
{
 char *addr;
 int shm_id;
 key_t key;
 
 //捕捉SIGUSR1
 if(signal(SIGUSR1,handler_signal) == SIG_ERR)
    {
  perror("Fail to signal");
  exit(EXIT_FAILURE);
 }

 //先运行
 if((key = ftok(argv[1],'k'))  < 0)
 {
  perror("Fail to key");
  exit(EXIT_FAILURE);
 }

 printf("key = %#x.\n",key);

    /*
  *int shmget(key_t key, size_t size, int shmflg);
  *第一个参数:
  *1.IPC_PRIVATE,每次都会获得一个新的共享内存,主要用于有亲缘关系的进程
  *2.通过ftok函数获得            
  * key_t key;
  * key = ftok(pathname,字符);
  *
  *第二个参数:
  *共享内存大小
  *
  *第三个参数:
  *IPC_CREAT,IPC_EXCL,权限
  */
 //如果对应的key的共享内存不存在,创建,然后返回其ID
 //如果对应的key的共享内存存在,直接返回ID
 if((shm_id = shmget(key,1024,IPC_CREAT | 0666)) < 0)
 {
  perror("Fail to shmget");
  exit(EXIT_FAILURE);
 }

 printf("shm_id = %d.\n",shm_id);
  
 //映射共享内存
 if( (    addr = (char *)shmat(shm_id,NULL,0)   )   == (char *)-1  )
 {
  perror("Fail to shmat");
  exit(EXIT_FAILURE);
 }

 //写自己PID到共享内存
 *( (int *)addr ) = getpid();
 
 while(1)
 {
  //等待被唤醒
  pause();
  printf("%s.\n",addr);

  if(strncmp(addr,"quit",4) == 0)
   break;
 }

 //解除映射
 if(shmdt(addr) < 0)
 {
  perror("Fail to shmdt");
  exit(EXIT_FAILURE);
 }

 //删除共享内存对象
 //真正删除:在共享内存映射次数为0的时候,才会删除
 if(shmctl(shm_id,IPC_RMID,NULL) < 0)
 {
  perror("Fail to shmctl");
  exit(EXIT_FAILURE);
 }

 exit(EXIT_SUCCESS);;
}

write.c中代码如下

#include
#include
#include
#include
#include
#include

//./a.out .
int main(int argc, const char *argv[])
{
 char *addr;
 int shm_id;
 key_t key;
 int peer_pid;

 if((key = ftok(argv[1],'k'))  < 0)
 {
  perror("Fail to key");
  exit(EXIT_FAILURE);
 }

 printf("key = %#x.\n",key);

    /*
  *int shmget(key_t key, size_t size, int shmflg);
  *第一个参数:
  *1.IPC_PRIVATE,每次都会获得一个新的共享内存,主要用于有亲缘关系的进程
  *2.通过ftok函数获得            
  * key_t key;
  * key = ftok(pathname,字符);
  *
  *第二个参数:
  *共享内存大小
  *
  *第三个参数:
  *IPC_CREAT,IPC_EXCL,权限
  */
 //如果对应的key的共享内存不存在,创建,然后返回其ID
 //如果对应的key的共享内存存在,直接返回ID
 if((shm_id = shmget(key,1024,IPC_CREAT | 0666)) < 0)
 {
  perror("Fail to shmget");
  exit(EXIT_FAILURE);
 }

 printf("shm_id = %d.\n",shm_id);
  
 //映射共享内存
 if( (    addr = (char *)shmat(shm_id,NULL,0)   )   == (char *)-1  )
 {
  perror("Fail to shmat");
  exit(EXIT_FAILURE);
 }

 //从共享内存中读取对方PID
 peer_pid = *((int *)addr);

 while(1)
 {
  fgets(addr,1024,stdin);
  addr[strlen(addr) - 1] = '\0';

  //发信号唤醒对方
  kill(peer_pid,SIGUSR1);
 }

 exit(EXIT_SUCCESS);;
}




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