linux 下用 c 实现 ls -l 命令
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
#include <string.h> void do_ls(char[]);
void dostat(char *);
void show_file_info( char *, struct stat *);
void mode_to_letters( int , char[] );
char * uid_to_name( uid_t );
char * gid_to_name( gid_t ); main(int ac, char *av[])
{
if( ac == )
do_ls( "." ); /*显示当前目录*/
else
while( --ac ){
printf("%s:\n", *++av); /*显示参数指定的目录*/
do_ls( *av );
}
} void do_ls( char dirname[] )
{
DIR *dir_ptr;
struct dirent *direntp; if( (dir_ptr = opendir( dirname )) == NULL) /*打开目录,成功则返回 DIR 结构指针*/
fprintf(stderr, "ls1: cannot open %s\n", dirname); else
{
while( ( direntp = readdir( dir_ptr ) ) != NULL )
dostat( direntp->d_name ); closedir( dir_ptr );
}
} void dostat( char *filename )
{
struct stat info; if( stat( filename, &info ) == - )
perror( filename );
else
show_file_info( filename, &info );
} void show_file_info( char *filename, struct stat *info_p )
{ if(filename[]!='.')
{
char *uid_to_name(), *ctime(), *gid_to_name(), *filemode();
void mode_to_letters(); char modestr[]; mode_to_letters( info_p->st_mode, modestr ); /*模式到字符的转换*/ printf("%s", modestr ); /*输出模式标识符*/ printf("%4d", (int)info_p->st_nlink); printf(" %-8s", uid_to_name(info_p->st_uid)); printf("%-8s", gid_to_name(info_p->st_gid)); printf("%8ld ", (long)info_p->st_size); printf("%.12s ", + ctime(&info_p->st_mtime)); printf("%s\n",filename);
} } void mode_to_letters( int mode, char str[] )
{
strcpy(str,"----------"); if( S_ISDIR(mode) ) str[] = 'd'; /*目录*/
if( S_ISCHR(mode) ) str[] = 'c'; /*字符文件*/
if( S_ISBLK(mode) ) str[] = 'b'; /*块文件*/ if(mode & S_IRUSR) str[] = 'r';
if(mode & S_IWUSR) str[] = 'w';
if(mode & S_IXUSR) str[] = 'x'; if(mode & S_IRGRP) str[] = 'r';
if(mode & S_IWGRP) str[] = 'w';
if(mode & S_IXGRP) str[] = 'x'; if(mode & S_IXOTH) str[] = 'r';
if(mode & S_IXOTH) str[] = 'w';
if(mode & S_IXOTH) str[] = 'x';
} #include <pwd.h> char *uid_to_name( uid_t uid )
/*
*返回和 uid 相应的用户名的指针
*/
{
struct passwd *getpwuid(), *pw_ptr;
static char numstr[]; if( ( pw_ptr = getpwuid( uid ) ) == NULL ) {
sprintf(numstr, "%d", uid); /*没有对应的用户名则 uid 存入 numstr,返回后以字符串的形式打印 uid*/
return numstr;
}
else
return pw_ptr->pw_name; /*打印用户名*/
} #include <grp.h> char *gid_to_name( gid_t gid )
{
struct group *getgrgid(), *grp_ptr;
static char numstr[]; if( ( grp_ptr = getgrgid(gid) ) == NULL ){ sprintf(numstr, "%d", gid);
return numstr;
}
else
return grp_ptr->gr_name;
}
linux 下用 c 实现 ls -l 命令的更多相关文章
- 实现Linux下的ls -l命令
基本实现了Linux下的ls -l命令,对于不同的文件显示不同的颜色和显示符号链接暂时没有实现: /************************************************** ...
- linux 下文件重命名/移动/复制命令(转)
linux 下文件重命名/移动/复制命令(转) linux下重命名文件:使用mv命令就可以了, 例:要把名为:abc 重命名为:123 可以这样操作: 重命名:MV命令 1.进入你的文件目录,运行 ...
- 构建LINUX下的入侵检测系统——LIDS 系统管理命令--vlock
构建LINUX下的入侵检测系统——LIDS 系统管理命令--vlock http://blog.chinaunix.net/uid-306663-id-2440200.html LIDS官方网站: ...
- Linux下如何保持gnome-terminal窗口执行命令后停留而不立刻关闭(gnome-terminal -x)
Linux下如何保持gnome-terminal窗口执行命令后停留而不立刻关闭(gnome-terminal -x) 转自:http://jakfruit.blog.163.com/blog/stat ...
- Linux下df与du两个命令的差别?
Linux下df与du两个命令的差别? 一.df显示文件系统的使用情况,与du比較,就是更全盘化. 最经常使用的就是 df -T,显示文件系统的使用情况并显示文件系统的类型. 举比例如以下: [roo ...
- linux下使用script和scriptreplay对命令行操作进行录像
转自:linux下用script和scriptreplay对命令行操作录像 在Linux中可以使用script命令来记录命令行的操作过程,并使用scriptreplay命令对命令操作进行回放,操作步骤 ...
- linux下查看动态链接库依赖关系的命令 x86: ldd *.so arm: arm-linux-readelf -d *.so 实际例子: 以项目中用到的库librtsp.so分析: lijun@ubuntu:~/workspace$ arm-hisiv100nptl-linux-ld -d librtsp.so arm-hisiv100nptl-linux-ld:
linux下查看动态链接库依赖关系的命令 x86:ldd *.so arm:arm-linux-readelf -d *.so 实际例子:以项目中用到的库librtsp.so分析:l ...
- Linux下mysql使用systemctl restart mysqld命令失败
Linux下mysql使用systemctl restart mysqld命令失败: 解决方法:将mysql赋予root的权限 vim /etc/passwd 找到mysql开头的一行文件mysql: ...
- linux下ls -l命令(即ll命令)查看文件的显示结果分析
在linux下使用“ls -l”或者“ls -al”或者“ll”命令查看文件及目录详情时,shell中会显示出好几列的信息.平时也没怎么注意过,今天忽然心血来潮想了解一下,于是整理了这篇博客,以供参考 ...
随机推荐
- 【week5】psp
本周psp psp饼图: 随笔字数折线图: 代码行折线图:
- 【Linux】- CentOS 7 安装.NET Core 2.1
添加dotnet产品Feed 在安装.NET Core之前,您需要注册Microsoft产品Feed. 这只需要做一次. 首先,注册Microsoft签名密钥,然后添加Microsoft产品Feed. ...
- 使用图片方式显示email地址
import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics2D ...
- 【bzoj1614】[Usaco2007 Jan]Telephone Lines架设电话线 二分+SPFA
题目描述 Farmer John打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用. FJ的农场周围分布着N(1 <= N <= 1 ...
- 关于 [lambda x: x*i for i in range(4)] 理解
题目: lst = [lambda x: x*i for i in range(4)] res = [m(2) for m in lst] print res 实际输出:[6, 6, 6, 6] 想要 ...
- wsgiref 源码解析
Web Server Gateway Interface(wsgi),即Web服务器网关接口,是Web服务器软件和用Python编写的Web应用程序之间的标准接口. 想了解更多关于WSGI请前往: h ...
- 前端开发学习之——dom ready和window onload的区别
1.ready事件是在页面中所有DOM结构已完全加载时执行,监听的是 DomContentload 事件,初始化并解析完成时触发,不需要等待样式表.图片和 iframes 加载完,也就是说当这个事件触 ...
- [洛谷P5174]圆点
题目大意:给你$R(R\leqslant10^{14})$,求:$$\sum\limits_{x\in\mathbb{Z}}\sum\limits_{y\in\mathbb{Z}}[x^2+y^2\l ...
- [洛谷P3979]遥远的国度
题目大意:有一棵$n$个点的树,每个点有一个点权,有三种操作: $1\;x:$把根变成$x$ $2\;u\;v\;x:$把路径$u->v$上的点权改为$x$ $3\;x:$询问以$x$为根的子树 ...
- bzoj 1221: [HNOI2001] 软件开发 (网络流)
注意说如果直接从每天的新的连向旧的,那整个图的最大流还是不变,答案就一直会是Σni*f type arr=record toward,next,cap,cost:longint; end; const ...