Linux ls源码分析

来源:互联网 发布:2k17贝克汉姆捏脸数据 编辑:程序博客网 时间:2024/06/05 09:25

main函数入口开始分析,关键代码主要有两部分,一部分是处理用户输入参数,另一部分是执行并输出结果:


一、处理用户输入参数——调用decode_switches函数:


  该函数的关键部分代码为一个switch,它根据传入的参数,设置相应的标志,如-i会对应设置print_inodetrue-R会对应设置recursivetrue



二、执行并输出结果——while循环:



  在默认情况下,print_dir会展示一层子目录,如果recursivetrue,则会在print_dir中调用extract_dirs_from_filespending_dirs继续添加子目录的子目录,从而递归展示子目录:



  该循环中用到了两个重要的数据结构,一个是pending_dirs,一个是active_dir_set

1pending_dirs结构:

  pending_dirs是目录pending_dir的链表队列,pending_dir的结构是:


  如果pending_dirrealname0,则该目录为普通目录,name是目录名,如果realname不为0,则该目录为一个软连接,realname为软连接名。这样区分是为了防止循环,如果子目录软连接到父目录,而没有特殊处理的话,将会发生死循环。

  pending_dirpending发生在extract_dirs_from_files函数中,该函数接受一个目录,并将该目录的子目录pendingpending_dir队列中,pending的方式有以下两个特点:

  1. 从队列头部pending

  1. 首先pending一个nameNULL的目录,该NULL目录起到毒丸的效果,代表所有子目录已经遍历完毕

  2. 逆序pending,由于输出时从队列头开始输出,因此添加目录时应逆序添加,保证输出时正序


2active_dir_set结构:


  active_dir_set中会放入当前正在处理的目录,当ls对一个目录作用或对其子目录作用时,该目录就会被放入active_dir_set。这个结构用来防止循环的发生,如果子目录是父目录的软连接,其device号和inode号是完全相同的,这时将子目录放入active_dir_set,会发现目录已存在。




0 0