本文討論實現(xiàn)的記錄log功能的模塊設計,以及如何實現(xiàn)對于其它模塊封裝細節(jié)實現(xiàn)信息隱藏。由于有些方面(例如項目中要求必須使用C,與遺留系統(tǒng)兼容等),只能使用C實現(xiàn),所以沒有用面向?qū)ο笳Z言C++, java, C#中類的實現(xiàn)方式。但使用了面向?qū)ο蟮乃枷耄缛绾翁峁┙涌诓僮飨嚓P屬性,如何最大程度實現(xiàn)信息隱藏等。 一. 封裝所有記錄log的函數(shù)在log_record.c中,那么需要考慮提供哪些函數(shù)給其它模塊調(diào)用。 可以有三個函數(shù) 1. void log_init(char * path); /* 根據(jù)路徑初始化log:打開log記錄文件等*/ 2. void log_print(char *file, int line, char * format, ...); /* 通過可變參數(shù)記錄log信息 */ 3. void log_end(); /* 程序結(jié)束后的log清理:關閉文件等 */ 這樣一來,其它模塊只需要使用這三個函數(shù)就能實現(xiàn)log的記錄功能了,具體如何實現(xiàn)就不用關心了。當然,此處函數(shù)參數(shù)已經(jīng)到了最簡。如果這三個函數(shù)之間有信息傳遞,如操作同一個文件描述符,則這個文件描述符要設置成全局變量的形式。 二. 多進程log操作,進程之間主要有兩種情況(針對2個進程,多個進程類似):
如果兩個不同的進程有自己獨立的log記錄功能則使用上面討論的log模塊就可以完全實現(xiàn)了。但如果兩個進程使用同一個log文件呢? 例如:有一個父進程,然后 fork()出一個或多個子進程,那么這時這種實現(xiàn)方式就會有問題存在,存在同時讀寫log文件的問題。如何解決呢? 有兩種方式可以解決
對于第一種方式,文件加鎖,如果進程操作頻繁,那么顯然加鎖,寫入文件會有效率低的問題。對于第二種方式,則可以很好解決這個問題。共享內(nèi)存作為一個緩沖區(qū),可以實現(xiàn)高速讀寫,這樣一來,就解決了效率低的問題。 |
|