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