Wget源码分析
1 关于浮点数的四舍五入
Wget是这样的intsecs = (int) (interval + 0.5);
Main函数的分析:i18n_initialize()这个函数是初始化一些标准环境和查找.mo文件的路径
然后就是获得可执行文件的文件名,如果是windows的话,去掉.exe后缀
2
Wget为分配的内存准备了一张表malloc_table这个全局变量是保存的,里面有三个成员,①地址②file③line文件所在行,这张表是由malloc_count,free_count其中前者是分配的个数,后者是释放的个数,全局变量初始化为0,当malloc_count-free_count>100003(分配给malloc_table的大小,如果再大的话,就会找不到相关的节点)的时候就直接发送abort信号(不知道是否进程对abort信号是否进行了处理,如果没处理的话,默认操作就是直接终止进程)
static void register_ptr(const void *ptr, const char *file, int line) { int i; if (malloc_count -free_count > SZ) { fprintf (stderr,"Increase SZ to a larger value and recompile.\n"); fflush (stderr); abort (); } i = ptr_position (ptr); malloc_table[i].ptr = ptr; malloc_table[i].file =file; malloc_table[i].line =line; }
其中malloc_table是一个hash表,并且进行了冲突处理的hash,如果i节点为空就直接写入到该节点,如果不为空就看是否是当前地址,如果不是的话就i的下一个节点寻找,这个表的大小事SZ =100003,这个只是一般的hash,并不是带卡槽的链表hash(大学的时候就是这种带错误处理的hash)
这个是ptr_position的源码:
static inline int ptr_position (const void *ptr) { int i = hash_pointer (ptr)% SZ; for (; malloc_table[i].ptr!= NULL; i = (i + 1) % SZ) if (malloc_table[i].ptr== ptr) return i; return i; }
3 initialize ();
初始化给option全局变量,这里面的宏比较复杂,说是如果用户有的话,就用用户自己的
4 init_switches()
这个函数就是为了把option_data转化成short_options、long_options,其中option_data是
struct cmdline_option { const char *long_name; char short_name; enum { OPT_VALUE, OPT_BOOLEAN, OPT_FUNCALL, /* Non-standard optionsthat have to be handled specially in main(). */ OPT__APPEND_OUTPUT, OPT__CLOBBER, OPT__DONT_REMOVE_LISTING, OPT__EXECUTE, OPT__NO, OPT__PARENT } type; const void *data; /* for standard options */ int argtype; /* for non-standard options*/ };
这个类型,在定义option的时候就直接初始化了。
{ "accept", 'A', OPT_VALUE, "accept", -1 },
{"append-output", 'a', OPT__APPEND_OUTPUT, NULL, required_argument },
{"auth-no-challenge", 0, OPT_BOOLEAN, "authnochallenge", -1},
{"background", 'b', OPT_BOOLEAN, "background", -1 },
{"backup-converted", 'K', OPT_BOOLEAN, "backupconverted", -1},
{ "backups",0, OPT_BOOLEAN, "backups", -1 },
{ "base", 'B',OPT_VALUE, "base", -1 },这些是初始化成员的值,这些都是wget的选项信息