当前位置: 首页 > news >正文

ls命令编写

学习编写ls命令,带参数 -l,

读取文件系统的信息要涉及到dirent.h头文件和相关函数

DIR* opendir(char *path); 打开目录,失败返回NULL

dirent* readdir(DIR* dir); 读取目录的记录,失败返回NULL

stat(direct* dir,stat *st); 读取每条记录的详细信息,失败返回-1

char* ctime(long); 将是数字串转换成字符时间函数,成功返回字符指针

char* getpwuid(int uid); 根据用户id返回用户名

char* getgrdgid(int gid); 根据组id返回组名

权限的转换方法见程序 规则见sys/stat.h和bits/stat.h头文件

该程序可以接收多各参数,效果同ls -l命令

参考unix/linux编程实践教程 编写


#include
< unistd.h >
#include
< stdio.h >
#include
< sys / types.h >
#include
< sys / stat.h >
#include
< dirent.h >
void  errmsg( char   * msg, char   * msg2);
void  do_ls( char   * dir);
void  do_stat_info( char   * statname);
void  do_file_info( char   * file_name, struct  stat  * );
void  mode_to_letters( int  mode, char  mode_str[]);
char   * uid_to_name(uid_t);  // define stat.h
char   * gid_to_name(gid_t);  // define stat.h

int  main( int  ac, char   * av[])
{
        
if (ac == 1 )
                do_ls(
" . " );
        
else
                
while ( -- ac)
                {
                        do_ls(
*++ av);
                }
}
void  errmsg( char   * msg, char   * msg2)
{
        fprintf(stderr,
" %s\n " ,msg);
        perror(msg2);
        exit(
1 );
}
void  do_ls( char   * dir)
{
        DIR 
* dir_p;
        
struct  dirent  *  dirent_p;
        
if ((dir_p = opendir(dir)) == NULL)
                errmsg(
" can't open directory. " ,dir);
        
else
        {
                
while ((dirent_p = readdir(dir_p)) != NULL)
                        do_stat_info(dirent_p
-> d_name);
                closedir(dir_p);
        }
}
void  do_stat_info( char   * statname)
{
        
struct  stat  * statinfo;    // can't use pointer,else malloc
        statinfo = ( struct  stat  * )malloc( sizeof ( struct  stat));
        
// stat(statname,statinfo);
         if (stat(statname,statinfo) ==- 1 )
                perror(statname);
        
else
                do_file_info(statname,statinfo);
        free(statinfo);
}
void  do_file_info( char   * filename, struct  stat  * statinfo)
{
        
char  mode_str[ 11 ];
        mode_to_letters(statinfo
-> st_mode,mode_str);
        printf(
" %-10s  " ,mode_str);
        printf(
" %4d  " ,statinfo -> st_nlink);
        printf(
" %-8s  " ,uid_to_name(statinfo -> st_uid));
        printf(
" %-8s  " ,gid_to_name(statinfo -> st_gid));
        printf(
" %8d  " ,statinfo -> st_size);
        printf(
" %.12s  " , 4 + ctime( & statinfo -> st_mtime)); // sub from 4 to 12 letters
        printf( " %s\n " ,filename);
}
void  mode_to_letters( int  mode, char  mode_str[])
{
        strcpy(mode_str,
" ---------- " );
        
if (S_ISDIR(mode)) mode_str[ 0 ] = ' d ' ;
        
if (S_ISCHR(mode)) mode_str[ 0 ] = ' c ' ;
        
if (S_ISBLK(mode)) mode_str[ 0 ] = ' b ' ;

        
if (S_IRUSR  &  mode) mode_str[ 1 ] = ' r ' ;
        
if (S_IWUSR  &  mode) mode_str[ 2 ] = ' w ' ;
        
if (S_IXUSR  &  mode) mode_str[ 3 ] = ' x ' ;
        
if (S_IRGRP  &  mode) mode_str[ 4 ] = ' r ' ;
        
if (S_IWGRP  &  mode) mode_str[ 5 ] = ' w ' ;
        
if (S_IXGRP  &  mode) mode_str[ 6 ] = ' x ' ;
        
if (S_IROTH  &  mode) mode_str[ 7 ] = ' r ' ;
        
if (S_IWOTH  &  mode) mode_str[ 8 ] = ' w ' ;
        
if (S_IXOTH  &  mode) mode_str[ 9 ] = ' x ' ;
}
#include
< pwd.h >
char   * uid_to_name(uid_t uid)
{
        
struct  passwd  * getpwuid(), * pwd;
        
char   * name_str;
        
if ((pwd = getpwuid(uid)) == NULL)
        {
                sprintf(name_str,
" %d " ,uid);  // redirct output
                 return  name_str;
        }
        
else
                
return  pwd -> pw_name;
}
#include
< grp.h >
char   * gid_to_name(gid_t gid)
{
        
struct  group  * getgrgid(), * gr;
        
char   * name_str;
        
if ((gr = getgrgid(gid)) == NULL)
                sprintf(name_str,
" %d " ,gid);  // redirect output
         else
                
return  gr -> gr_name;
        
return  name_str;
}

 

转载于:https://www.cnblogs.com/ringwang/archive/2009/04/05/1429814.html

相关文章:

  • 智能家居老年监控市场规模将到2020年时增长将超过600%
  • linux 中断和终端测试程序
  • 公共免费Wi-Fi服务让意大利高山峡谷旅游胜地焕发活力
  • POJ 2533 Longest Ordered Subsequence
  • 解读ERP顾问的行为准则
  • 專來選擇
  • 《Node.js区块链开发》——2.4 应用场景
  • 灾备行业正在发生的4大趋势
  • Having-Sql语法
  • 联想移动裁员为求自保 摩托罗拉品牌逐渐消退
  • 隔行换色,鼠标滑过行变色 [转载]
  • 雅虎邮箱也“出血”了,雅虎选择弃用ImageMagick
  • C#编程利器之三:接口(Interface)
  • 用开源软件搭建自己的物联网项目
  • 空气中充满 Web 的味道:11 个最佳 Adobe AIR 应用
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • Akka系列(七):Actor持久化之Akka persistence
  • CSS居中完全指南——构建CSS居中决策树
  • css选择器
  • github从入门到放弃(1)
  • Java基本数据类型之Number
  • js 实现textarea输入字数提示
  • KMP算法及优化
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 聊聊redis的数据结构的应用
  • 巧用 TypeScript (一)
  • 双管齐下,VMware的容器新战略
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 问题之ssh中Host key verification failed的解决
  • 项目管理碎碎念系列之一:干系人管理
  • 自定义函数
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​如何在iOS手机上查看应用日志
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #Linux(帮助手册)
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • #微信小程序:微信小程序常见的配置传旨
  • $$$$GB2312-80区位编码表$$$$
  • $.ajax()
  • $.ajax,axios,fetch三种ajax请求的区别
  • (3)nginx 配置(nginx.conf)
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (分布式缓存)Redis哨兵
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)母版页和相对路径
  • .htaccess配置常用技巧
  • .md即markdown文件的基本常用编写语法
  • .NET CF命令行调试器MDbg入门(一)
  • .net refrector
  • .net操作Excel出错解决
  • .pop ----remove 删除
  • [ vulhub漏洞复现篇 ] Apache Flink目录遍历(CVE-2020-17519)
  • [BZOJ4010]菜肴制作
  • [BZOJ4554][TJOI2016HEOI2016]游戏(匈牙利)