S.l.e!ep.¢%

像打了激速一样,以四倍的速度运转,开心的工作
简单、开放、平等的公司文化;尊重个性、自由与个人价值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

使用Share Memory时的shmget失败与ftok的关系。

对于长期运行的系统,产生的日志是大量的,即使每2秒一条,一天也有4W多条。假如我们只需要在想观察的时候动态地看到当前记录或计数,那么可以将日志的信息写到一个共享内存区,然后写一个LogReader,去访问这个共享内存区即可。

 

要使用共享内存,应该有如下步骤:
1.开辟一块共享内存 shmget()
2.允许本进程使用共某块共享内存 shmat()
3.写入/读出

需要删除这块内存的时候,步骤为

4.禁止本进程使用这块共享内存 shmdt()
5.删除这块共享内存 shmctl()或者命令行下ipcrm

 

过程会用到以下的这些函数:

 int shmget( key_t shmkey , int shmsiz , int flag );

 创建一个新的共享内存区或打开一存在的共享内存区

 

void *shmat( int shmid , char *shmaddr , int shmflag );

返回共享内存区在调用进程内的起始地址。 shmaddr最好设置为NULL,这样系统会替我们选择地址,可移植性更强;否则会根据shmflag时候指定了SHM_RND,将共享内存区附接到shmaddr参数指定的地址。

 

今天调试的时候发现了以下的这些问题:两个需要通信的进程使用一个同样的字符串调用ftok生成key,并对该key调用shmget,其中有一个不能访问到共享内存区。查阅了UNP2才明白了。


ftok将一个已存在的路径名和一个整数标识符转换成一个key_t值。

     key_t ftok(const char *pathname, int proj_id)

ftok会组合三个值来产生key:

1、pathname所在的文件系统的信息。

2、该文件在本文件系统内的索引节点号。

3、id的低序8位。

 

key_t的生成是以一个已存在的文件作为输入,并不是简单的字符串散列函数,必须真正存在某个文件,才能将其位置传入ftok。

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理