仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 520|回复: 9
打印 上一主题 下一主题

[其他Linux] Linux设计Linux ll命令(ls -l)的代码完成仓酷云

[复制链接]
若相依 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:29:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
不同版本的Linux命令数量不一样,这里笔者把它们中比较重要的和使用频率最多的命令。
$llwget
total544
drwxr-xr-x3orisunorisun40962011-12-1509:48./
drwxr-xr-x65orisunorisun40962011-12-2019:45../
drwxr-xr-x11orisunorisun40962011-08-0921:55wget-1.13/
-rw-r--r--1orisunorisun5407562011-12-1509:47wget.pdf
目次老是不为空,它最少包括两项:.代表以后路径,..代表父路径。
ll命令用于列出一个目次下的文件的具体信息:

  • 文件形式
    这是个16位的2进制。最高4位暗示文件范例,接上去3位顺次是suid、sgid、sticky,前面的9位顺次是user、group、other的读写实行标记。
    文件范例:
    1000    -    一般文件
    0100    d    目次
    0110    b    块设备
    0010    c    字符设备
    0001    p    定名管道
    1010    l    标记链接
    1100    s    套接字
    文件可读意味着能够用cat命令检察,可写能够用vi翻开。文件夹可实行则可使用cd命令。
    suid代表set-user-id,设置用户ID,即实行该文件的用户就像本文件的一切者一样。好比任何用户都能够经由过程password命令来修正本人的暗码,可是存储暗码的文件/etc/passwd的具有者是root,其他用户是没有写权限的。而可实行文件/usr/bin/passwd的具有者也是root,同时它的suid位上是1。则一般用户在运转/usr/bin/passwd的时分就成了root身份,既然是root身份天然对/etc/passwd具有了写权限。那末passwd命令能不克不及修正其他用户的暗码呢?不克不及!由于passwd命令会经由过程体系挪用getuid来取得以后用户的ID,它只能修正这个ID用户的暗码。假如文件具有者原本具有写权限,同时suid位上是1,则相就位上的x会酿成s;假如文件原本不是可实行文件,则响应位上会酿成S。
    sgid与suid类同。
    sticky对文件和文件夹有分歧的服从。sticky文件告知体系要把文件放在swap地区。从互换空间加载程序比从一般磁盘地区加载要快,由于程序在硬盘上大概被分为好几块寄存在很多分歧的中央,而在互换空间上文件是不分块的。以是经常使用的程序如编纂器、编译器会放在互换空间。不外如今互换手艺已没那末主要了,取而代之的是假造内存,由于假造内存能够以更小的单元(如页page)举行互换。sticky使得一个目次里的文件只能被创立者删除,在/tmp目次里,谁都能够举行创立/删除文件。其他用户的x被交换这t,代表sticky被设置。
  • 第二列显现链接数(硬链接),即指向该文件的援用次数。
  • 第三列是文件一切者。/etc/passwd文件中包括用户列表,但它并没有包括一切的用户,由于在收集体系中,一台呆板能够被良多用户登录,此时一切的用户信息都存储在一台叫作NIS的服务器上,一切的主机经由过程NIS举行身份考证。固然当地的/etc/passwd也存储了部分用户列表(这是NIS上用户列表的一个子集),以备离线操纵。每一个用户都有一个ID,该用户创立的文件有一个属性值就是此ID,这里就有一个成绩,当用户被删除后,他创立的文件还在,假如厥后又到了一个新用户,他恰好又被付与了被删除的谁人用户的ID,那末本来用户创立的文件回新用户一切。
  • 第四列是文件具有者地点的主组。不错,一个用户能够属于多个组。/etc/group里存储组列表。
  • 第五列是文件巨细。令我们猎奇的是为何下面三个文件夹的巨细都是4096?这是由于目次所占的空间是以块为分派单元的,每块为512B。关于一样平常文件,则列出实践字节数。
  • 第六列是文件的最初修正工夫。
  • 第七列是文件名。
上面会商怎样来编程完成ll命令。
文件的良多基础信息都能够经由过程体系挪用lstat来猎取,它前往一个布局体:
  1. structstat{dev_tst_dev;/*IDofdevicecontainingfile*/ino_tst_ino;/*inodenumber*/mode_tst_mode;/*protection*/nlink_tst_nlink;/*numberofhardlinks*/uid_tst_uid;/*userIDofowner*/gid_tst_gid;/*groupIDofowner*/dev_tst_rdev;/*deviceID(ifspecialfile)*/off_tst_size;/*totalsize,inbytes*/blksize_tst_blksize;/*blocksizeforfilesystemI/O*/blkcnt_tst_blocks;/*numberof512Bblocksallocated*/time_tst_atime;/*timeoflastaccess*/time_tst_mtime;/*timeoflastmodification*/time_tst_ctime;/*timeoflaststatuschange*/};
复制代码
一个structstat内里仿佛包括了我们编写ll命令所需的一切文件信息,但有些体现情势上还不合错误。

  • 文件形式我们但愿以“-rw-rw-r--"的情势显现,但st_mode是个十进制数。这里可使用掩码来猎取响应的位标识。
  • 用户和组供应的是ID,而不是称号。经由过程UID来猎取用户名能够用getpwuid(uid)->p_name,依据GID来猎取组名能够用getgrgid(gid)->gr_name。getpwuid()先从当地/etc/passwd上查找用户,假如没有,再从NIS中猎取。
  • st_mtime是time_t范例的,我们能够经由过程体系挪用localtime把它转换成structtm范例:
    1. structtm{inttm_sec;/*seconds*/inttm_min;/*minutes*/inttm_hour;/*hours*/inttm_mday;/*dayofthemonth*/inttm_mon;/*month*/inttm_year;/*year*/inttm_wday;/*dayoftheweek*/inttm_yday;/*dayintheyear*/inttm_isdst;/*daylightsavingtime*/};
    复制代码
    必要注重的是,这里的tm_year是减往了1990的,tm_mon是从0入手下手盘算的。
上面给出完全代码。
  1. #include<stdio.h>#include<time.h>#include<sys/types.h>#include<dirent.h>#include<sys/stat.h>#include<stdlib.h>#include<string.h>voiddo_ls(char[]);voiddostat(char*);voidshow_file_info(char*,structstat*);voidmode_to_letters(int,char[]);char*uid_to_name(uid_t);char*gid_to_name(gid_t);voidmain(intargc,char*argv[]){if(argc==1)do_ls(".");elseprintf("输出命令./ls便可,不要带任何参数。
  2. ");}voiddo_ls(chardirname[]){DIR*dir_ptr;//路径变量structdirent*direntp;//存储路径下一个子项信息的布局体if((dir_ptr=opendir(dirname))==0)fprintf(stderr,"ls:cannotopen%s
  3. ",dirname);else{while((direntp=readdir(dir_ptr))!=0)dostat(direntp->d_name);closedir(dir_ptr);}}voiddostat(char*filename){structstatinfo;if(lstat(filename,&info)==-1)perror("lstat");elseshow_file_info(filename,&info);}voidshow_file_info(char*filename,structstat*info_p){charmodestr[11];mode_to_letters(info_p->st_mode,modestr);printf("%-12s",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);time_ttimelong=info_p->st_mtime;structtm*htime=localtime(&timelong);printf("%-4d-%02d-%02d%02d:%02d",htime->tm_year+1990,htime->tm_mon+1,htime->tm_mday,htime->tm_hour,htime->tm_min);printf("%s
  4. ",filename);}/*这个函数写得不敷周全,起首文件范例不全,其次没有思索suid,sgid,sticky*/voidmode_to_letters(intmode,charstr[]){strcpy(str,"----------");if(S_ISDIR(mode))str[0]=d;if(S_ISCHR(mode))str[0]=c;if(S_ISBLK(mode))str[0]=b;if(mode&S_IRUSR)str[1]=r;if(mode&S_IWUSR)str[2]=w;if(mode&S_IXUSR)str[3]=x;if(mode&S_IRGRP)str[4]=r;if(mode&S_IWGRP)str[5]=w;if(mode&S_IXGRP)str[6]=x;if(mode&S_IROTH)str[7]=r;if(mode&S_IWOTH)str[8]=w;if(mode&S_IXOTH)str[9]=x;}#include<pwd.h>//#include能够呈现在代码中的任何地位char*uid_to_name(uid_tuid){structpasswd*pw_str;staticcharnumstr[10];if((pw_str=getpwuid(uid))==NULL){sprintf(numstr,"%d",uid);//假如没有取得用户名,则间接把uid看成用户名returnnumstr;}elsereturnpw_str->pw_name;}#include<grp.h>char*gid_to_name(gid_tgid){structgroup*grp_ptr;staticcharnumstr[10];if((grp_ptr=getgrgid(gid))==NULL){sprintf(numstr,"%d",gid);returnnumstr;}elsereturngrp_ptr->gr_name;}
复制代码


<br>


常常有些朋友在Linux论坛问一些问题,不过,其中大多数的问题都是很基的。
乐观 该用户已被删除
沙发
发表于 2015-1-21 07:46:53 来自手机 | 只看该作者
虽然大家都比较喜欢漂亮的mm,但是在学 linux 的过程中,还是要多和“男人”接触一下:P 遇到问题的时候,出来看说和上网查之外,就是要多用 linux 下的 man 命令找找帮助。
再见西城 该用户已被删除
板凳
发表于 2015-1-30 11:48:48 | 只看该作者
Linux最大的特点就是其开源性,这一点是十分难得的,这也是它能够存在到现在的原因之一。
地板
发表于 2015-2-3 12:48:50 | 只看该作者
在学习linux的工程中,linux学习方法有很多种,这里是小编的学习心得,给大家拿出来分享一下。
只想知道 该用户已被删除
5#
发表于 2015-2-7 03:46:12 | 只看该作者
甚至目前许多应用软件都是基于它的。可是没有哪一个系统是十分完美的。
愤怒的大鸟 该用户已被删除
6#
发表于 2015-2-7 10:06:55 | 只看该作者
安装一个新的软件时先看README,再看INSTALL然后看FAQ,最后才动手安装,这样遇到问题就知道为什么。如果Linux说明文档不看,结果出了问题再去论坛来找答案反而浪费时间。
深爱那片海 该用户已被删除
7#
发表于 2015-2-11 19:12:46 | 只看该作者
生成新的unispimsp.ksc。”另外得到回复后如果问题解决,向帮助过你的人发个说明,让他们知道问题是怎样解决的。
不帅 该用户已被删除
8#
发表于 2015-3-7 10:33:13 | 只看该作者
在系统检测不到与Linux兼容的显卡,那么此次安装就可能不支持图形化界面安装,而只能用文本模式安装等等。
兰色精灵 该用户已被删除
9#
发表于 2015-3-14 23:31:54 | 只看该作者
学习Linux半年了~个人认为不会的多在网上找资料网上有很多资料可以搜索到,LS那位说放手去搞。
小女巫 该用户已被删除
10#
发表于 2015-3-21 14:56:30 | 只看该作者
放手去搞。尽量不要提问,运用搜索找答案,或者看wiki,从原理上理解操作系统的本质,而不是满足于使用几个技巧。尽量看英文资料。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-24 02:06

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表