ls -r
这篇博客继续深入探索ls命令。下面的程序代码继续沿用了上两篇文章所用的错误处理方式,但又对之前的错误处理进行了升级,加入了错误处理函数error_print 。并且通过atexit函数加入了动态分配内存的收集与处理。
由于我的编译环境在终端,每一行只能显示80个字符,所以有些语句太长我该成了两行。
// lsr.h
#ifndef LSR
#define LSR
#include <stdio.h> // printf()
#include <unistd.h> // getcwd()
#include <string.h> // strlen() strcpy() strcat() memset()
#include <stdlib.h> // exit() malloc() free() atexit()
#include <dirent.h> // opendir() closedir() readdir()
typedef struct FileInfoList {
// 使用链表存储
char *name; // 存储文件/文件夹名
struct FileInfoList *dir; // 当name存储文件名时为空
// 当name存储文件夹名时指向文件夹中的文件
struct FileInfoList *file; // 指向下一个(next)
} file_info_list;
file_info_list head; // 全局变量 头节点
// 这个结构体作为链表节点存储动态内存分配后需要释放的动态内存空间
typedef struct NeedFreeList {
char *ptr; // 需要free的指针
struct NeedFreeList *next; // 下一个
} need_free_list;
need_free_list *begin = NULL; // 全局变量 开头指针
typedef enum ERROR {
// 各种错误信息
ERROR_CODE_OK,
ERROR_CODE_MALLOC_GETPATH,
ERROR_CODE_MALLOC_COLLECT,
ERROR_CODE_GETCWD,
ERROR_CODE_OPENDIR,
ERROR_CODE_COLLECT,
ERROR_CODE_MALLOC_NODE,
ERROR_CODE_MALLOC_NAME,
ERROR_CODE_MALLOC_DIRPATH
} error;
error malloc_collect(char *); // 动态内存分配后收集需要free的动态内存指针
void clear(void); // 终止处理程序
void error_print(error); // 错误信息输出
error getpath(char**); // 得到路径
error filename_collect(char*, file_info_list*); // 文件名收集函数 (递归)
void sort(file_info_list*, file_info_list*); // 将节点插入链表中并保持有序
void print(file_info_list*, int); // 输出以head为头节点存储的文件/文件夹名
#endif
下面时 .c 文件,包含具体的函数实现
// lsr.c
#include "lsr.h"
//#define TEST
int main(void)
{
atexit(clear); // 登记clear这个终止处理程序
char *path;
error errcode = getpath(&path); // 得到当前路径 实参是指针path的地址 不是path
if (errcode