欢迎来到天天文库
浏览记录
ID:36970088
大小:58.50 KB
页数:7页
时间:2019-05-16
《c语言实现ls -l的功能》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、Linux下C语言实现ls-l功能需求:用ls-l显示文件夹下所有的文件及属性分析:1用ls显示文件夹下的所有文件,首先用opendir打开文件夹,再用readdir读取文件夹里面的文件,最后closedir关闭文件夹。2用ls-l比较复杂,打印出来的内容包括:(文件属性+文件名)由以下几部分构成——文件的类型(d——目录文件-——文本文件...)文件的可执行权限所属组的权限,其它组的权限硬链接数文件拥有者文件拥有者组文件大小时间文件名解决方案:1.要想实现ls-l就得知道通过什么系统调用获取文件信息,首先自然是要通过man来查找相关的系统调
2、用。man-kfile
3、grepstatusman-kfile
4、grepinformationman-kfile
5、grepinfo通过上面的搜索就可以得到stat这个系统调用获取文件属性。man2stat获取系统调用的详细使用方法:#include#include#includestructstat{dev_tst_dev;/*IDofdevicecontainingfile*/ino_tst_ino;/*inodenumber*/mode_tst_mode;/*prote
6、ction*/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*
7、/time_tst_atime;/*timeoflastaccess*/time_tst_mtime;/*timeoflastmodification*/time_tst_ctime;/*timeoflaststatuschange*/};只要通过相应字段进行格式处理就行啦!2.权限处理:st_mode就是文件的权限部分。St_mode本身就是一个16位的二进制,前四位是文件的类型,紧接着三位是特殊权限,左后九位就是ls-l列出来的九个权限。linux本身提供了很多测试宏来测试文件的类型的#define__S_IFMT0170000/*The
8、sebitsdeterminefiletype.*//*Filetypes.*/#define__S_IFDIR0040000/*Directory.*/#define__S_IFCHR0020000/*Characterdevice.*/#define__S_IFBLK0060000/*Blockdevice.*/#define__S_IFREG0100000/*Regularfile.*/#define__S_IFIFO0010000/*FIFO.*/#define__S_IFLNK0120000/*Symboliclink.*/#def
9、ine__S_IFSOCK0140000/*Socket.*/利用上面的测试宏就可以判断文件的类型,至于文件的权限部分可以使用掩码的方式来处理。具体代码如下:vimfile_mode.c#include"list.h"//man2stat可看到文件基本属性voidfile_mode(structstat*buf){inti;charbuff[10]={"----------"};switch(buf->st_mode&S_IFMT)//按位&获取文件基本属性{caseS_IFIFO:buff[0]='f';break;caseS_IFDIR:
10、buff[0]='d';break;caseS_IFSOCK:buff[0]='s';break;caseS_IFBLK:buff[0]='b';break;caseS_IFLNK:buff[0]='l';break;}if(buf->st_mode&S_IRUSR)buff[1]='r';if(buf->st_mode&S_IWUSR)buff[2]='w';if(buf->st_mode&S_IXUSR)buff[3]='x';if(buf->st_mode&S_IRGRP)buff[4]='r';if(buf->st_mode&S_IW
11、GRP)buff[5]='w';if(buf->st_mode&S_IXGRP)buff[6]='x';if(buf->st_mode&S_IROTH)buff[7
此文档下载收益归作者所有