实现是通过不断扫描指定的文件,通过比较两次扫描的状态来判断文件的变化。
文件状态数据结构:
/* filestat struct for monitoring */
typedef struct filestat
{
char f_name[FNAME_MAX];
struct stat f_stat;
int f_flag; /* 0 for del,
1 for add, 2 for modified , 3 for unchanged */
struct filestat *next;
}filestat;
设计思路:对指定的文件,文件夹进行扫描,获取文件状态并记录在statlist链表中,没扫描一个文件,在statlist中查找,如果没有找到,则为新增文件,插入到链表,并置f_flag为1;如果找到,比较mtime和ctime,如果相同,则说明,文件内容,Inode都没有发生变化,则文件未发生变化,置f_flag为3,如果不同,则说明文件被修改过,置f_flag为2。
扫描完成后对链表执行check操作,如果为1(而且不是第一次扫描),打印添加日志,如果为2打印修改日志,为3则为变化,check后置f_flag为0,所以当check中的f_flag为0时,说明文件被删除。。。。
调试中遇到段错误,虽然后来改过来了,但还是不知道错误处在哪里。第一次使用gdb发现程序问题,对执行过程进行跟踪。并使用宏来决定是否打印调试日志(这点很重要,跟一个师兄学的,在程序里用了下)。
//#define MONITOR_DEBUG /* for debug, comment it to run in non debug mod */
#ifdef MONITOR_DEBUG
#define PDEBUG(format, arg...) fprintf(stderr, format, ##arg)
#else
#define PDEBUG(format, arg...)
#endif
总的感觉,自己的基本功还不够扎实,linux c 里面很多东西没用过。。。加油
|