快速业务通道

如何来写自己的ls命令

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-16
ar out[500];
char *p;
if (lstat(argv[1],&buf)==-1)
{
// printf("No such file\n");
return -1;
}
}

这个时候我们已经得到了buf这个结构体,从这个结构体中很容易就能写出以下信息,实现起来比较容易:

//连接数
printf(" %d",buf.st_nlink);
// 用户id
struct passwd *user;
user=getpwuid(buf.st_uid);
printf(" %s",user->pw_name);
//组id
struct group *group;
group=getgrgid(buf.st_gid);
printf(" %s",group->gr_name);
//大小
printf(" %d ",buf.st_size);
//时间
struct tm *t;
t=localtime(&buf.st_ctime);
printf(" %d-%d-%d %d:%d",t->tm_year 1900,
t->tm_mon 1,
t->tm_mday,
t->tm_hour,
t->tm_sec);
printf(" %s",argv[1]);

到目前为止,还剩下文件类型,以及对于用户,组,其他用户的读写权限没有解析出来,其实我们所需要的信息已经包含在buf的st_mode中,只要对这个返回的st_mode进行解析就可以得到我们所需要的信息.

Empire CMS,phome.net

先来看看文件的类型,如何对文件类型来判断呢?可以使用掩码来解码得到文件的类型.在<sys/stat.h>中有以下定义:

#define S_IFMT 0170000
#define S_IFREG 0100000
#define S_IFDIR 0040000
#define S_IFBLK 0060000
....
我们如何要判断文件类型是否是普通文件,可以写如下代码:
if( (info.st_mode & 0170000) == 0100000)
printf("this is a regular file");

当然我们也可采取<sys/stat.h>中定义的宏来实现
#define S_ISFIFO(m) ((m) &(0170000) == (0010000))
#define S_ISREG(m) ( (m) & (0170000) == 0100000))
....

我们也可以写如下代码:

if( S_ISDIR(info.st_mode) )
printf("this is a regular file");

现在继续补充刚刚没有写完的程序:

if (S_ISREG(buf.st_mode)) p="-";
else if (S_ISDIR(buf.st_mode)) p="r";
else if (S_ISCHR(buf.st_mode)) p="c";
else if (S_ISBLK(buf.st_mode)) p="b";
else if (S_ISFIFO(buf.st_mode)) p="f";
else if (S_ISLNK(buf.st_mode)) p="l";
else if (S_ISSOCK(buf.st_mode)) p="s";

还剩下文件对不同用户的权限的描述怎么实现,同理用以上的方式来实现.

int n;
for(n=8;n>=0;n--)
{
if(buf.st_mode&(1<<n))
switch (n%3)
{
case 2: printf("r"); break;
case 1: printf("w"); break;

Empire CMS,phome.net

case 0: printf("x"); break;
}
else
printf("-");
}

这样将这四段写在一起,就完成了实现ls –l 特定的文件的功能.

Empire CMS,phome.net

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号