实现病毒扫描功能的后台进程,它使用socket通信、信号同步、线程池、后台进程等典型技术。
标准C库提供了对命令行参数进行分析的函数:
#include
int getopt(int argc, char *const argv[ ] , const char *optstring);//argc和argv[ ]是main函数的参数,optstring表示分析选项的方法
extern char *optarg;//用来存放选项值
extern int optind , opterr , optopt;
#define _GNU_SOURCE
#include
int getopt_long(int argc, char * const argv[ ], const char *optstring , const struct option *longopts, int *longindex);//longopts为用户定义的选项数组
int getopt_long_only(int argc, char * const argv[ ], const char *optstring , const struct option *longopts, int *longindex);//longindex为命令行选项的序号
struct option//结构option描述了命令行一个参数选项的构成
{
const char *name; //长参数选项名
int has_arg; //选项值个数:0,1,2,其中2表示值可有可无
int *flag; //flag为NULL,则getopt_long返回val,否则返回0
int val; //指明返回值,短参数名
}
在clamd/option.c中的函数main解析了命令行的各种选项,调用上述C库函数getopt_long依次分析出每个命令行选项,并将每个命令行选项及值存储在链表中,并提供了对这个链表的操作函数,如:创建链表、释放链表、读取链表成员、加入链表成员等。链表定义如下:
struct optnode{ //链表结点结构
char optchar; //短选项名
char *optchar; //选项值,来自于C库函数getopt_long解析并存在全局变量optarg中的选项值
char *optname; //长选项名
struct optnode *next; //下一个节点,当为最后一个时,指向NULL
};
struct optstruct{
struct optnode *optlist; //命令行选项链表
char *filename;
};