Linux ls源码分析
来源:互联网 发布:2k17贝克汉姆捏脸数据 编辑:程序博客网 时间:2024/06/05 09:25
从main函数入口开始分析,关键代码主要有两部分,一部分是处理用户输入参数,另一部分是执行并输出结果:
一、处理用户输入参数——调用decode_switches函数:
该函数的关键部分代码为一个switch,它根据传入的参数,设置相应的标志,如-i会对应设置print_inode为true,-R会对应设置recursive为true:
二、执行并输出结果——while循环:
在默认情况下,print_dir会展示一层子目录,如果recursive是true,则会在print_dir中调用extract_dirs_from_files向pending_dirs继续添加子目录的子目录,从而递归展示子目录:
该循环中用到了两个重要的数据结构,一个是pending_dirs,一个是active_dir_set:
(1)pending_dirs结构:
pending_dirs是目录pending_dir的链表队列,pending_dir的结构是:
如果pending_dir的realname为0,则该目录为普通目录,name是目录名,如果realname不为0,则该目录为一个软连接,realname为软连接名。这样区分是为了防止循环,如果子目录软连接到父目录,而没有特殊处理的话,将会发生死循环。
pending_dir的pending发生在extract_dirs_from_files函数中,该函数接受一个目录,并将该目录的子目录pending到pending_dir队列中,pending的方式有以下两个特点:
从队列头部pending
首先pending一个name为NULL的目录,该NULL目录起到毒丸的效果,代表所有子目录已经遍历完毕
逆序pending,由于输出时从队列头开始输出,因此添加目录时应逆序添加,保证输出时正序
(2)active_dir_set结构:
active_dir_set中会放入当前正在处理的目录,当ls对一个目录作用或对其子目录作用时,该目录就会被放入active_dir_set。这个结构用来防止循环的发生,如果子目录是父目录的软连接,其device号和inode号是完全相同的,这时将子目录放入active_dir_set,会发现目录已存在。
- Linux ls源码分析
- linux中ls源码简单分析
- Linux命令分析: ls
- linux ls
- linux ls
- linux ls
- linux--------ls
- linux ls
- 实现linux下ls -l的c源码
- linux:ls、ls -l、ls -al区别
- linux:ls、ls -l、ls -al区别
- ls命令源码
- ls -l 源码解析
- linux mtd源码分析
- Linux netfilter源码分析
- Linux RAMDisk 源码分析
- linux schedul源码分析
- Linux netfilter源码分析
- CSS 3新特性学习----颜色和透明度
- Android Framework中的Application Framework层介绍
- Undefined symbols for architecture x86_64
- SharePoint 2013 App Development读书笔记2
- linux命令:more命令
- Linux ls源码分析
- 使用eclipse运行带有main函数的Java文件时,出现editor does not contain a main type的错误框
- centos 6.4编译busybox报错 "Trying libraries: crypt m"
- C++中CONST的用法总结
- 与GIS相关的SCI、EI期刊与会议
- 逻辑Data Guard的配置
- UML
- UNIX操作系统类型
- IOS ANE的坑爹之路二