分享

Linux多进程之间LOG模块的实现方式讨论 | 学步园

 埕絮妞 2015-04-17

  本文讨论实现的记录log功能的模块设计,以及如何实现对于其它模块封装细节实现信息隐藏。由于有些方面(例如项目中要求必须使用C,与遗留系统兼容等),只能使用C实现,所以没有用面向对象语言C++, java, C#中类的实现方式。但使用了面向对象的思想,如如何提供接口操作相关属性,如何最大程度实现信息隐藏等。

一. 封装

  所有记录log的函数在log_record.c中,那么需要考虑提供哪些函数给其它模块调用。

  可以有三个函数

1. void log_init(char * path);                                /* 根据路径初始化log:打开log记录文件等*/

2. void log_print(char *file, int line, char * format, ...);  /* 通过可变参数记录log信息 */

3. void log_end();                                            /* 程序结束后的log清理:关闭文件等 */

  这样一来,其它模块只需要使用这三个函数就能实现log的记录功能了,具体如何实现就不用关心了。当然,此处函数参数已经到了最简。如果这三个函数之间有信息传递,如操作同一个文件描述符,则这个文件描述符要设置成全局变量的形式。

二. 多进程log操作,进程之间主要有两种情况(针对2个进程,多个进程类似):

  1. 两个进程相互独立。
  2. 两个进程之间有关系。(例如:在Linux中两个进程的父子关系)

  如果两个不同的进程有自己独立的log记录功能则使用上面讨论的log模块就可以完全实现了。但如果两个进程使用同一个log文件呢?

例如:有一个父进程,然后 fork()出一个或多个子进程,那么这时这种实现方式就会有问题存在,存在同时读写log文件的问题。如何解决呢?

  有两种方式可以解决

  1. 对文件加锁
  2. 使用共享内存,对共享内存加锁,当共享内存满了之后可以再写入磁盘。

  对于第一种方式,文件加锁,如果进程操作频繁,那么显然加锁,写入文件会有效率低的问题。对于第二种方式,则可以很好解决这个问题。共享内存作为一个缓冲区,可以实现高速读写,这样一来,就解决了效率低的问题。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多