/*
该文件简单模拟linux系统的ls命令(实现了大部份功能)
历史记录:
日期 作者 描述 联系方式
2014.04.14 卢富波 首次创建 164830775@qq.com
功能需求(FIXME),只做了个人觉得常用的选项:
--help(--h) -h 只显示帮助信息,不进行任何其它动作,其它参数作废
-a 显示所有文件(即包括隐藏文件)
-l 显示详细信息
-L 只打印链接文件名
-r 反排序
-R 递归显示,即遇到目录会再次进入目录把文件列举出来
-c 以属性最后修改时间排序
-t 以修改时间排序
-u 以创建时间排序
-S 以文件大小排序
-n 以文件名排序(以文件名排序,是默认排序,如果有多种排序也只采用文件名排序)
-i 显示I节点
-d 显示设备序号
-b 显示块大小
-C 显示占多少块
FIXME:
已知BUG:
(1) 打印出来的文件大小,我是打印的实际文件大小(个人偏好),标准的是打印的块大小*块数
*/
#include <time.h>
#include <stdio.h>
#include <getopt.h>
#include <errno.h>
#include <string.h>
#include <sys/stat.h>
#include <dirent.h>
#include <stdlib.h>
#include <assert.h>
#include <getopt.h>
#include <pwd.h>
#include <grp.h>
#include <unistd.h>
#include "lib/list.h"
#define MAX_PATH 256 /*文件或者目录名的最大长度*/
#define PEER_MALLOC_FILE 64 /*当内存不够时,最少申请多少个struct file_info的大小
避免频繁申请内存*/
/*一个文件基本信息的节点*/
struct file_info
{
char fil_name[MAX_PATH]; /* 文件名节点 */
char dst_name[MAX_PATH]; /* 链接文件名真实名 */
char is_link; /* 是否是链接文件 1:是 0:否 */
struct stat statbuf; /*文件属性节点*/
};
/*一个目录的信息列表*/
struct dir_info
{
char dir_path[MAX_PATH]; /*目录名节点*/
struct file_info *p_filenode; /*指向该目录下的文件信息
内存类似于数组,之所以不采用链表,是为了好用qsort进行排序*/
size_t used_size; /*已用了多少个strcut file_info*/
size_t free_size; /*空余还有多少个strcut file_info*/
size_t dir_size; /*该目录的大小(单位为k),用ls -l显示的第一行 total(总用量)的值*/
char need_print_total; /*该目录是否需要打印total*/
};
/*等待遍历节点的节点*/
struct dir_list
{
char dir_path[MAX_PATH]; /*待遍历的目录节点*/
struct list_head list_node; /*链表节点*/
};
struct param
{
char a; /* 显示所有文件 */
char l; /* 显示详细信息 */
char L; /* 只显示链接文件 */
char r; /* 反排序 */
char R; /* 递归显示 */
char c; /* 状态修改时间排序*/
char t; /* 最后修改时间排序*/
char u; /* 最后访问时间排序*/
char S; /* 以文件大小排序*/
char n; /* 以文件名排序*/
char i; /* 显示I节点*/
char d; /* 显示每块大小*/
char C; /* 显示占了多少块*/
char h; /* 显示帮助信息*/
};
typedef int (*COM_FUNC)(const void *, const void *);
struct dir_info g_dir_info; /*当前正处理的目录*/
struct param g_param; /*传入参数*/
struct list_head g_dir_head; /*需要扫描目录的链表头*/
COM_FUNC g_com_func = NULL;
static void
printf_usage()
{
printf("usage:\n");
printf("-h --help(--h) show the help infomation\n");
printf("-a show all files\n");
printf("-l show the detailed information\n");
printf("-L only show linkname if the file is linkfile\n");
printf("-r recursive display\n");
printf("-c sort by status change\n");
printf("-t sort by last modify time\n");
printf("-u sort by last access time\n");
printf("-S sort by file size\n");
printf("-n sort by file name, the default.And if input more than one sort way, only sort by file name\n");
printf("-i show i-node info\n");
printf("-d show I/O block size\n");
printf("-C show number of disk blocks\n");
}
/*计算一个目录的大小,即ls -l显示出来的第一行 "total" */
static void
cal_dir_size()
{
size_t i;
struct file_info *p;
g_dir_info.dir_size = 0;
g_dir_info.need_print_total = 1; /*需要打印total字段标志*/
for(i = 0; i < g_dir_info.used_size; ++i)
{
p = g_dir_info.p_filenode + i;
g_dir_info.dir_size += p->statbuf.st_blksize * p->statbuf.st_blocks;
}
/*换算为k*/
g_dir_info.dir_size = g_dir_info.dir_size/1024/8;
}
/*
程序带错误码退出
*/
static void
dead_errno(int no)
{
assert(0);
exit(no);
}
/*FIXME 内存追加方式申请内存*/
static void
realloc_file_info(struct dir_info *dir_info)
{
assert(dir_info != NULL);
assert(dir_info->free_size == 0); /*没空闲内存了才会申请*/
size_t newsize; /*新内存的大小*/
newsize = (dir_info->used_size + PEER_MALLOC_FILE)*sizeof(struct file_info);
if((dir_info->p_filenode = realloc(dir_info->p_filenode, newsize)) == NULL)
{
perror("realloc");
dead_errno(1);
}
dir_info->free_size += PEER_MALLOC_FILE;
}
static void
save_file_info(struct dir_info *dir_info, struct stat *stat, char *d_name, char *dst_name)
{
assert(d_name != NULL && d_name[0] != 0);
struct file_info *pfile_info = NULL;
assert(dir_info != NULL && stat != NULL);
if(dir_info->p_filenode == NULL || dir_info->free_size == 0)/*内存不够*/
realloc_file_info(dir_info);
pfile_info = dir_info->p_filenode + dir_info->used_size;
strncpy(pfile_info->fil_name, d_name, MAX_PATH-1);
memmove(&pfile_info->statbuf, stat, sizeof(struct stat));
if(dst_name != NULL) /*d_name是链接文件*/
{
pfile_info->is_link = 1;
strncpy(pfile_info->dst_name, dst_name, MAX_PATH-1);
}
else
{
pfile_info->is_link = 0;
pfile_info->dst_name[0] = 0;
}
--(dir_info->free_size);
++(dir_info->used_size);
}
static void
add_dir(char *pdir, struct list_head *head)
{
assert(pdir != NULL && pdir[0] != 0 && head != NULL);
struct dir_list *pnode = NULL;
if((pnode = (struct dir_list*)malloc(sizeof(struct dir_list))) == NULL)
{
printf("malloc dir_list error\n");
exit(1);
}
memset(pnode, 0, sizeof(struct dir_list));
strncpy(pnode->dir_path, pdir, MAX_PATH-1);
list_add_tail(&pnode->list_node, head);
}
/*
以最后状态修改时间排序函数
*/
static int
cmp_last_statetime(const void *arg1, const void *arg2)
{
struct file_info *p1 = (struct file_info*)arg1;
struct file_info *p2 = (struct file_info*)arg2;
return p1->statbuf.st_ctime - p2->statbuf.st_ctime;
}
/*
以文件最后修改时间排序函数
*/
static int
cmp_last_change(const void *arg1, const void *arg2)
{
struct file_info *p1 = (struct file_info*)arg1;
struct file_info *p2 = (struct file_info*)arg2;
return p1->statbuf.st_mtime - p2->statbuf.st_mtime;
}
/*
以文件最后访问时间排序函数
*/
static int
cmp_last_accesstime(const void *arg1, const void *arg2)
{
struct file_info *p1 = (struct file_info*)arg1;
struct file_info *p2 = (struct file_info*)arg2;
return p1->statbuf.st_atime - p2->statbuf.st_atime;
}
/*
以文件大小排序函数
*/
static int
cmp_filesize(const void *arg1, const void *arg2)
{
struct file_info *p1 = (struct file_info*)arg1;
struct file_info *p2 =
没有合适的资源?快使用搜索试试~ 我知道了~
c语言实现linux命令,大概三四十个
共73个文件
c:47个
h:25个
makefile:1个
需积分: 3 75 下载量 105 浏览量
2017-12-22
16:50:39
上传
评论 9
收藏 86KB RAR 举报
温馨提示
c语言实现linux命令,大部分Linux的命令都涉及到了,可以参考下 c语言实现linux命令,大部分Linux的命令都涉及到了,可以参考下 c语言实现linux命令,大部分Linux的命令都涉及到了,可以参考下 c语言实现linux命令,大部分Linux的命令都涉及到了,可以参考下
资源推荐
资源详情
资源评论
收起资源包目录
c语言实现linux命令.rar (73个子文件)
c语言实现linux命令
my_linux_command
test_dir
test_va_list.c 2KB
df.c 3KB
paste.c 4KB
date.c 6KB
join.c 8KB
reboot.c 1KB
tr.c 3KB
split.c 5KB
chmod.c 2KB
ls.c 20KB
rmdir.c 1KB
test.c 625B
cp.c 2KB
whoami.c 2KB
tee.c 3KB
sed.c 3KB
rm.c 2KB
lib
is_digit.h 947B
list.h 4KB
file_isexist.h 2KB
gettime.h 398B
safe-read.h 451B
chown.h 4KB
str_match.h 3KB
mkdir.h 2KB
fileflag.h 2KB
yesno.h 643B
find_file.h 3KB
copy.h 9KB
link.h 745B
rmdir.h 483B
get_filesize.h 2KB
command_comm.h 513B
rename.h 923B
char_map.h 3KB
chmod.h 3KB
err_msg.h 906B
is_root_process.h 438B
bit_opr.h 268B
remove.h 3KB
pwd.h 767B
umask.h 2KB
who.c 2KB
cut.c 8KB
tac.c 4KB
chgrp.c 2KB
du.c 1KB
rename.c 1KB
echo.c 636B
sort.c 7KB
last.c 4KB
which.c 2KB
od.c 3KB
pwd.c 2KB
mkfifo.c 2KB
wc.c 5KB
ln.c 2KB
lsattr.c 3KB
head.c 5KB
touch.c 4KB
find.c 2KB
mkdir.c 2KB
expand.c 2KB
makefile 301B
chattr.c 4KB
chown.c 2KB
cat.c 4KB
tail.c 9KB
getopt_long.c 2KB
umask.c 1KB
grep.c 3KB
mv.c 2KB
uniq.c 9KB
共 73 条
- 1
资源评论
Mr.姚先森
- 粉丝: 25
- 资源: 51
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功