Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1477240
  • 博文数量: 842
  • 博客积分: 12411
  • 博客等级: 上将
  • 技术积分: 5772
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-14 14:43
文章分类

全部博文(842)

文章存档

2013年(157)

2012年(685)

分类: LINUX

2013-07-26 16:48:44

系统建立IPC通讯(如消息队列、共享内存时)必须指定一个ID值。通常情况下,该id值通过ftok函数得到。
ftok原型如下:
key_t ftok( char * fname, int id )
fname就时你指定的文件名(该文件必须是存在而且可以访问的),id是子序号,虽然为int,但是只有8个比特被使用(0-255)。
当成功执行的时候,一个key_t值将会被返回,否则 -1 被返回。
    在一般的UNIX实现中,是将文件的索引节点号取出,前面加上子序号得到key_t的返回值。如指定文件的索引节点号为65538,换算成16进制为 0x010002,而你指定的ID值为38,换算成16进制为0x26,则最后的key_t返回值为0x26010002。
查询文件索引节点号的方法是: ls -i

第一个是写数据:

testwrite.c(此处)

  1. /***** testwrite.c *******/
  2. #include
  3. #include
  4. #include
  5. #include
  6. typedef struct{
  7. char name[4];
  8. int age;
  9. } people;
  10. main(int argc, char** argv)
  11. {
  12. int shm_id,i;
  13. key_t key;
  14. char temp;
  15. people *p_map;
  16. char* name = "/dev/shm/myshm2";
  17. key = ftok(name,0);
  18. if(key==-1)
  19. perror("ftok error");
  20. /*先用ftok创建一个key,再调用shmget,创建一块共享内存区域*/
  21. shm_id=shmget(key,4096,IPC_CREAT);
  22. if(shm_id==-1)
  23. {
  24. perror("shmget error");
  25. return;
  26. }
  27. /*将这块共享内存区附加到自己的内存段*/
  28. p_map=(people*)shmat(shm_id,NULL,0);
  29. temp='a';
  30. for(i = 0;i<10;i++)
  31. {
  32. temp+=1;
  33. memcpy((*(p_map+i)).name,&temp,1);
  34. (*(p_map+i)).age=20+i;
  35. }
  36. /*写数据完毕,将其从自己的内存段中“删除”出去*/
  37. if(shmdt(p_map)==-1)
  38. perror(" detach error ");
  39. }
2、读数据

testread.c(此处)

  1. /*读进程首先要得到那块内存块,这个时候,ftok根据文件名和ID创建的key就
  2. 很用了,步骤同创建是一样的*/
  3. /********** testread.c ************/
  4. #include
  5. #include
  6. #include
  7. #include
  8. typedef struct{
  9. char name[4];
  10. int age;
  11. } people;
  12. main(int argc, char** argv)
  13. {
  14. int shm_id,i;
  15. key_t key;
  16. people *p_map;
  17. char* name = "/dev/shm/myshm2";
  18. key = ftok(name,0);
  19. if(key == -1)
  20. perror("ftok error");
  21. shm_id = shmget(key,4096,IPC_CREAT);
  22. if(shm_id == -1)
  23. {
  24. perror("shmget error");
  25. return;
  26. }
  27. p_map = (people*)shmat(shm_id,NULL,0);
  28. for(i = 0;i<10;i++)
  29. {
  30. printf( "name:%s\n",(*(p_map+i)).name );
  31. printf( "age %d\n",(*(p_map+i)).age );
  32. }
  33. if(shmdt(p_map) == -1)
  34. perror(" detach error ");
  35. }
注:事实上,ftok函数仅仅是根据文件名和ID生成一个起标识作用的key,根据《GNU Linux编程指南》说,Linux下实现这一函数还有点问题,不推荐用。于是我一般来说都是自己定义一个唯一的key,而不使用ftok函数。
阅读(1390) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~