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

此生再无相见时 提交于 2019-12-18 03:40:56

对于长期运行的系统,产生的日志是大量的,即使每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。
 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!