现在的位置: 首页 > 综合 > 正文

wget源码分析1

2012年10月09日 ⁄ 综合 ⁄ 共 1877字 ⁄ 字号 评论关闭

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的选项信息

抱歉!评论已关闭.