unix环境高级编程 /ls的实现,以及目录这种文件等

2023-10-29

ls的思路:

a/  --------------->目录

  b--------------->文件名 

想要获取某目录下(比如a目下)b文件的详细信息,我们应该怎样做?

1、首先,我们使用opendir函数打开目录a,返回指向目录a的DIR结构体c。          

指向 目录a 的 DIR结构体指针c = opendir(a)                      

2、接着,我们调用readdir( c)函数读取目录a下所有文件(包括目录),返回指向目录a下所有文件的dirent结构体d。

指向  目录a的所有文件  的  dirent结构体指针 d = readdir(c)

3、实现 ls 的功能

#include"apue.h"                 //作者自定义的头文件
#include<dirent.h>

int main(int argc , char *argv[])
{
    DIR  *dp;
    struct dirent *dirp;
    
    if(argc != 2){
          err_quit("usage : ls directory_name");     //作者自定义的错误处理函数
    }

    if((dp = opendir(argv[1])) == NULL)                 //dp可以看做打开目录的一个句柄(lxm)
        err_sys("can't open %s", argv[1]);              //作者自定义的错误处理函数

    while ((dirp = readdir(dp)) != NULL ){         //通过句柄来读取目录;dirp指向  的应该是该目录下第一个文件的信息DIR 结构体(readdir的返回值)
                                 //每readdir(dp)一次,dirp指向下一个文件
    printf("%s\n," dirp->d_name);              //dirp指向保存文件信息的DIR结构体,可以获取每个文件的名字。
  }
    closedir(dp);
    exit(0);
}

  

 

 

4、实现 ls -l 的功能

  如果想获得类似ls -l那种效果的文件信息,必须要靠stat函数了。

通过readdir函数读取到的文件名存储在结构体dirent的d_name成员中,而函数

int stat(const char *file_name, struct stat *buf);

的作用就是获取文件名为d_name的文件的详细信息,存储在stat结构体中。

然后,我们遍历d,调用stat(d->name,stat *e)来获取每个文件的详细信息,存储在stat结构体e中。

总体就是这样一种逐步细化的过程,在这一过程中,三种结构体扮演着不同的角色。

DIR结构体  

DIR结构体类似于FILE,是一个内部结构

struct __dirstream   
   {   
    void *__fd;    
    char *__data;    
    int __entry_data;    
    char *__ptr;    
    int __entry_ptr;    
    size_t __allocation;    
    size_t __size;    
    __libc_lock_define (, __lock)    
   };   
  
typedef struct __dirstream DIR;  

  

以下几个函数 用  这个内部结构  保存  当前正在被读取的目录   的有关信息

函数 DIR *opendir(const char *pathname),即打开文件目录,返回的就是指向DIR结构体的指针,而该指针由以下几个函数使用:

struct dirent *readdir(DIR *dp);   
  
void rewinddir(DIR *dp);   
  
int closedir(DIR *dp);   
  
long telldir(DIR *dp);   
  
void seekdir(DIR *dp,long loc);  

  

dirent结构体

目录文件(directory file)的概念:这种文件包含了  其他文件的名字  以及指向与这些文件 有关的信息的  指针

dirent不仅仅指向目录,还指向目录中的具体文件,readdir函数同样也读取目录下的文件,

struct dirent   
{   
  long d_ino; /* inode number 索引节点号 */  
     
    off_t d_off; /* offset to this dirent 在目录文件中的偏移 */  
     
    unsigned short d_reclen; /* length of this d_name 文件名长 */  
     
    unsigned char d_type; /* the type of d_name 文件类型 */  
     
    char d_name [NAME_MAX+1]; /* file name (null-terminated) 文件名,最长255字符 */  
}  

  从上述定义也能够看出来,dirent结构体存储的关于文件的信息很少,所以dirent同样也是起着一个索引的作用。

stat结构体--保存更详细的信息

struct stat {   
  
        mode_t     st_mode;       //文件访问权限   
  
        ino_t      st_ino;       //索引节点号   
  
        dev_t      st_dev;        //文件使用的设备号   
  
        dev_t      st_rdev;       //设备文件的设备号   
  
        nlink_t    st_nlink;      //文件的硬连接数   
  
        uid_t      st_uid;        //所有者用户识别号   
  
        gid_t      st_gid;        //组识别号   
  
        off_t      st_size;       //以字节为单位的文件容量   
  
        time_t     st_atime;      //最后一次访问该文件的时间   
  
        time_t     st_mtime;      //最后一次修改该文件的时间   
  
        time_t     st_ctime;      //最后一次改变该文件状态的时间   
  
        blksize_t st_blksize;    //包含该文件的磁盘块的大小   
  
        blkcnt_t   st_blocks;     //该文件所占的磁盘块   
  
      };  

  

 

转载于:https://www.cnblogs.com/liuxiaomeng/p/8408994.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

unix环境高级编程 /ls的实现,以及目录这种文件等 的相关文章

  • 03C++11多线程编程之测试join,detach传各种实参时形参的拷贝次数

    03C 11多线程编程之测试join detach传各种实参时形参的拷贝次数 首先我们看下面的总结测试图 然后一步步的测试 1 这里我们先测试join传实参的类型 当实参为普通对象时 1 当形参为普通对象时 拷贝了两次 2 当形参为引用时
  • 计算机二级python(本人整理的所有含答案操作题)

    全国计算机二级 本人整理的所有操作题 包括答案 直接上链接 有道云笔记 喜欢的可以直接下载 本人复习了三天 看了视频 把所有解题记了一遍 直接过了 https note youdao com ynoteshare index html id
  • 机器学习常识 17: 多标签学习

    摘要 多标签学习从标签个数上来扩展数据模型 进一步还有标签分布学习 1 基本概念 多标签学习在 机器学习常识 3 分类 回归 聚类 中简单提到过 这里列举出几个相关概念 一起来讨论下 将训练数据的标签表示为 Y mathbf Y Y 二分类
  • idea搜索不到free mybatis plugins

    作者Gitee主页说明 换行业 不再维护 Jb market也提交了下架 下面有一个peer move and update插件 地址是 https github com chuntungho free mybatis plugins 或者
  • Google登录授权详细过程

    前言 这篇文章包含了google登录授权从API创建 到使用Java代码完成登录的一个完整demo 主要为了实现google关联用户的服务 如google merchant center等 如果仅仅需要使用google邮箱登录 建议由前端实
  • 10个统计分析方法

    为什么要学习统计学习 首先 为了知道如何以及何时使用各种分析方法 理解各种分析方法背后的思想很重要 要想掌握更精巧复杂的方法 你必须先理解较简单的方法 其次 当你想准确地评估一种分析方法的效果时 你得知道其运行的多好或者多么不好 第三 这是
  • Spring Boot引起的“堆外内存泄漏”排查及经验总结

    背景 为了更好地实现对项目的管理 我们将组内一个项目迁移到MDP框架 基于Spring Boot 随后我们就发现系统会频繁报出Swap区域使用量过高的异常 笔者被叫去帮忙查看原因 发现配置了4G堆内内存 但是实际使用的物理内存竟然高达7G
  • 7.1 超级账本

    Matthew Hancock Ed Vaizey以及Linux基金会执行董事Jim Zemlin都认为区块链技术和分布式账本这两个概念是可以互换的 通过分布式账本 几乎任何有价值的东西都可以被跟踪和交易 Jim Zemlin认为 分布式账
  • 10个杀手级应用的Python自动化脚本

    10个杀手级应用的Python自动化脚本 重复的任务总是耗费时间和枯燥的 想象一下 逐一裁剪100张照片 或者做诸如Fetching APIs 纠正拼写和语法等任务 所有这些都需要大量的时间 为什么不把它们自动化呢 在今天的文章中 我将与你
  • VS2012创建ATL工程及使用MFC测试COM组件

    VS2012创建ATL工程及使用MFC测试COM组件 原创 2015年01月22日 16 23 21
  • 浏览器开发者模式F12的基本使用

    chrome浏览器的开发者工具可通过F12快捷键打开 1 调整开发者工具在页面的显示 2 检查界面元素 设备切换 网页或终端 终端选择 断点查看 3 可查看不同手机的界面适配问题 4 如何打断点 5 目标位置界面点击鼠标右键 检查 也可打开
  • ubuntu中conda安装pytorch 和 torch-geometric

    conda创建虚拟环境 conda create n pytorch python 3 7 conda activate pytorch 安装cuda nvidia smi 在这里插入图片描述 https img blog csdnimg
  • 铃木uy125最高时速_6K公里了谈谈轻骑铃木UY125的感受

    这也是很多人关心的 我以前是骑电驴的 电驴的动力弱 上坡无力这些都是常态 大排 公升的我没骑过 所以不谈 仅仅说下我的感受 转弯很灵活 我1米85的个子 极限转弯时 车把不会碰到膝盖 压弯不能太低 会蹭两侧的板子 离地间隙不高 比如上绿化带
  • Qt

    Qt 配置文件QSettings的使用方法 1 简介 配置文件常见的作用是启动软件是保留上次软件退出是的界面状态 如果不保留配置 且软件界面的内容又比较多 重启软件后界面恢复默认 那么每次打开界面都需要重新设置 这样比较麻烦 所以可以使用配
  • Qt中各种消息框对话框的使用

    在程序运行时 经常需要提示用户一些信息 比如警告啊 提示啊 建议啊之类的东西 这些东西基本上是通过消息框与用户进行交互的 Qt中主要是用QMessageBox类来加以实现的 消息框一般分为七种 Question询问消息框 为正常的操作提供一
  • 在小熊派BearPi-HM_Micro_small开发板上安装HAP

    引言 本文介绍如何在小熊派BearPi HM Micro small开发板上安装HAP 参考 https gitee com bearpi bearpi hm micro small blob master applications Bea
  • docker 非root用户修改mount到容器的文件出现“Operation not permitted

    使用环境centos7 x86 64 内核版本4 19 9 docker使用非root用户启动 daemon json配置文件内容如下 cat daemon json userns remap dockertest 映射的user和grou
  • UMG通过参数传递子弹个数给HUD

    今天 看UMG文档 发现无法传递 原因是应该传递到TEXT 而不是EditText 1 在firstpersonCharacter蓝图里 1 创建HUD 并保留HUD指针 2 发射时 子弹数 1 为0时不能发射 3 按R键 子弹数满 25
  • 逻辑回归梯度下降推导

    目录 什么是逻辑回归 逻辑回归的代价函数是怎么来的 逻辑回归求导 参考 什么是逻辑回归 逻辑回归 Logistic Regression 是用于处理因变量为分类变量的回归问题 常见的是二分类或二项分布问题 也可以处理多分类问题 它实际上是属
  • [c++11]多线程编程(五)——unique_lock

    c 11 多线程编程 五 unique lock 转自 https www jianshu com p 34d219380d90 互斥锁保证了线程间的同步 但是却将并行操作变成了串行操作 这对性能有很大的影响 所以我们要尽可能的减小锁定的区

随机推荐

  • el-table树形数据全部展开和收缩(toggleRowExpansion)

    本文主要讲根据element ui文档的toggleRowExpansion实现el table树形数据全部展开和收缩 1 页面效果 2 HTML页面展示 树形数据 直接使用element ui的demo数据 div div
  • Linux下特有的reboot()函数的简介

    1 Linux下c程序通过调用reboot 函数 可以实现系统的重启 挂机 Power Down等功能 2 1 对于libc5或libc4来说 库函数的原型声明中包含四个参数 具体函数原型声明如下 include
  • Linux内核浮点运算

    首次在linux内核驱动使用浮点型运算时出现了 undefined reference to aeabi uidiv 等错误 主要参考 Vedic的博客 toradexsh的博客 根据Vedic的博客修改makefile即可
  • vs2012编译boost_1_53_0

    Boost库的介绍 Boost库是一个经过千锤百炼 可移植 提供源代码的C 库 作为标准库的后备 是C 标准化进程的发动机之一 Boost库由C 标准委员会库工作组成员发起 其中有些内容有望成为下一代C 标准库内容 在C 社区中影响甚大 其
  • 数字签名MD4、MD5

    在本文中 模二加 记为 bigoplus 是二进制位的异或操作 如1模二加1和0模二加1都等于0 1模二加0等于1 模 2 32
  • 对机器进行免密之后还是不能免密登录

    查看远程机器的 var log secure日志 有以下错误 Authentication refused bad ownership or modes for directory home loanusr ssh Authenticati
  • Dynamics CRM2013 Lookup Filtering using addCustomFilter

    dynamics crm中对lookup视图的过滤是一个很平常性的需求 在2011的时候都是用添加自定义视图的方式例如下面这段示例代码 span style font size 18px var pEntityName sc stock v
  • Rust学习资料

    Installing Rust Rustup the Rust installer and version management tool Windows Subsystem for Linux Cargo the Rust build t
  • Spring Security Oauth2 刷新token源码分析

    刷新token请求接口 oauth token 参数 grant type refresh token client id client secret 源码解析 1 grant type为固定值 grant type refresh tok
  • 解决Win10家庭版不能使用grpedit.msc

    前言 大家都认为 Windows 10家庭版中并不包含组策略 其实不然 它是有相关文件的 只是不让你使用而已 那么我们让系统允许你使用就好了 操作步骤 1 首先你需要在桌面上新建一个txt文本文档 然后将以下代码复制到这个新建的txt文本文
  • 常见模拟电路设计 三(含仿真) :文氏桥正弦波发生电路

    参加电赛的过程中遇到了一个需要制作正弦波发生器的任务 这里分享一下方案 对于低频 几十K以下 的正线波信号 完全可以由RC振荡器来实现而不需要引入电感L 文氏桥电路的基本结构 首先 红色箭头标明的是文氏桥电路的桥臂 桥臂既是选频部分 也是正
  • ubuntu 20.04中sources.list文件恢复系统默认源

    前言 ubuntu 20 04中sources list文件恢复系统默认源 小白学习 误该后改不回来 找了很久才找到 做个记录 一 sources list文件恢复系统默认源 1 进入编辑 sources list 代码如下 sudo ge
  • JWT解密和python反序列化之[CISCN2019 华北赛区 Day1 Web2]ikun

    知识点 JWT 和cookie一个类型 用于认证身份 将jwt值放在JSON Web Tokens jwt io解密 可以得到结果 但是想要伪造其他的用户的话需要密钥 密钥使用c jwt cracker 中的 jwtcrack 进行破解 破
  • 浏览器辅助神器:油猴脚本使用教程

    油猴脚本 是一段脚本代码 通过它可以让浏览器实现各种各样的扩展功能 和浏览器扩展的作用类似 比如获去链接重定向 微博页面精简 去广告等 相当于给浏览器开了个挂 可以说是浏览器的辅助神器了 相信很多用户都是通过度盘下载脚本认识它的 但它的功能
  • 华为机试OD真题 javaScript和java 叠积木 堆积木

    叠积木 javascript和java两种方式实现 题目描述 给出一个列表如 6 7 5 4 3 2 表示木块的长和宽 当木块的长和宽不大于另个木块的长和宽时 就可以放在上面 此外数组还可以左右翻转 求最多能搭多少层 输入描述 一个二维数组
  • Shell实现自动更新目录名称与文件中版本号信息与时间戳

    背景 修改如下样例目录下所有目录的版本号信息与时间戳 修改如下样例文件中的版本号信息与时间戳 样例目录 find template patch dir template patch dir template patch dir ONIP S
  • 【爬虫实例】下载英雄联盟所有英雄的皮肤

    爬虫 下载英雄联盟所有英雄的皮肤 import requests import os def download pifu ip response requests get ip result response json print resu
  • MongoDB导出命令

    MongoDB导出 1 MongoDB导出命令 1 MongoDB导出命令 在MongoDB的安装目录的bin目录下 有mongoexport这个命令 可以用于mongo的数据导出 mongoexport h ip port port d
  • linux x64 asm 参数传递,NASM汇编学习系列(1)——系统调用和参数传递

    0 说明 本学习系列代码几乎完全摘自 asmtutor com 如果英文可以的 也可以用谷歌浏览器翻译看 可以直接看asmtutor com上的教程 系统环境搭建 我用的是ubuntu18 04 4 server 安装gcc g sudo
  • unix环境高级编程 /ls的实现,以及目录这种文件等

    ls的思路 a gt 目录 b gt 文件名 想要获取某目录下 比如a目下 b文件的详细信息 我们应该怎样做 1 首先 我们使用opendir函数打开目录a 返回指向目录a的DIR结构体c 指向 目录a 的 DIR结构体指针c opendi