(P6)文件与IO:stat、stat结构体

2024-06-08 06:18
文章标签 结构 io p6 stat

本文主要是介绍(P6)文件与IO:stat、stat结构体,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 1.stat
    • 2.stat结构体
    • 3.stat的eg
    • 4.实现ls -l功能需要的函数

1.stat

  • 功能:读取文件元数据
int stat(const char *pathname, struct stat *buf);
int fstat(int fd, struct stat *buf);
int lstat(const char *pathname, struct stat *buf);
  • lstat与stat的区别:
    若是符号链接文件,lstat查看的是符号链接本身的状态,而stat查看的是符号链接所指向的文件的状态

2.stat结构体

 struct stat {dev_t     st_dev;         /* ID of device containing file */设备号:高8位放主设备号,低8位放次设备号ino_t     st_ino;         /* inode number */mode_t    st_mode;        /* file type and mode */文件权限,文件类型nlink_t   st_nlink;       /* number of hard links */uid_t     st_uid;         /* user ID of owner */gid_t     st_gid;         /* group ID of owner */dev_t     st_rdev;        /* device ID (if special file) */若是设备文件,设备文件所所对应的设备号off_t     st_size;        /* total size, in bytes */blksize_t st_blksize;     /* blocksize for filesystem I/O */blkcnt_t  st_blocks;      /* number of 512B blocks allocated */若是块设备文件,块设备的数量/* Since Linux 2.6, the kernel supports nanosecondprecision for the following timestamp fields.For the details before Linux 2.6, see NOTES. */struct timespec st_atim;  /* time of last access */struct timespec st_mtim;  /* time of last modification */struct timespec st_ctim;  /* time of last status change */#define st_atime st_atim.tv_sec      /* Backward compatibility */#define st_mtime st_mtim.tv_sec#define st_ctime st_ctim.tv_sec};

3.stat的eg

  • eg:代码:
//下面的头文件来自man 2 open
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>//下面的头文件来自man 2 stat
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>//获取高8位
#define MAJOR(a) (int)((unsigned short)a >> 8)
//获取低8位
#define MAJOR(a) (int)((unsigned short)a & 0xFF)#define ERR_EXIT(m) \do \{ \perror(m); \exit(EXIT_FAILURE); \} while(0)int filetype(struct stat *buf);
void filepermission(struct stat *buf, char *perm);int main(int argc, char **argv)
{if (argc != 2)fprintf(stderr, "Usage %s file\n", argv[0]);struct stat sbuf;printf("filename:%s\n", argv[1]);if (stat(argv[1], &sbuf) == -1)ERR_EXIT("stat error");printf("File number:major %d, minnor %d, inode %d\n", MAJOR(sbuf.st_dev), MINOR(sbuf.st_dev), (int)sbuf.st_ino);if(filetype(&sbuf))printf("Device number:major %d, minor %d\n", MAJOR(sbuf.st_dev), MINOR(sbuf.st_dev));//输出文件权限,注意要与上0777//%o输出8进制数printf("FIle permission bits=%o\n", sbuf.st_mode & 0777);char perm[11] = '0';filepermission(&sbuf, perm)printf("FIle permission bits=%o_%s\n", sbuf.st_mode & 0777, perm);return 0;
}int filetype(struct stat *buf)
{//文件类型在man 2 statint flag = 0;printf("filetype");mode_t mode;mode = buf->st_mode;switch (mode & S_IFMT){case S_IFSOCK:printf("socket\n");break;case S_IFLNK:printf("symbolic link\n");break;case S_IFREG:printf("regular file\n");break;case S_IFBLK:printf("block device\n");flag =1;break;case S_IFDIR:printf("directory\n");break;case S_IFCHR:printf("character device\n");flag = 1;break;  case S_IFIFO:printf("FIFO\n");break; default:printf("unknow file type\n");break;                   }return flag;
}//将文件权限转换成字符
void filepermission(struct stat *buf, char *perm)
{//初始化strcpy(perm, "----------");perm[0]="?";mode = buf->st_mode;switch (mode & S_IFMT){case S_IFSOCK:perm[0] = 's';break;case S_IFLNK:perm[0] = 'l';break;case S_IFREG:perm[0] = '-';break;case S_IFBLK:perm[0] = 'b';flag =1;break;case S_IFDIR:perm[0] = 'd';break;case S_IFCHR:perm[0] = 'c';flag = 1;break;  case S_IFIFO:perm[0] = 'p';break;               }if (mode & S_IRUSR)perm[1] = 'r';if (mode & S_IWUSR)perm[2] = 'w';if (mode & S_IXUSR)perm[3] = 'x';if (mode & S_IRGRP)perm[4] = 'r';if (mode & S_IXGRP)perm[5] = 'w';if (mode & S_IXGRP)perm[6] = 'x';if (mode & S_IROTH)perm[7] = 'r';if (mode & S_IXOTH)perm[8] = 'w';if (mode & S_IXOTH)perm[9] = 'x';perm[10] = '\0';
}
  • 测试:
    为什么Makefile的主设备号是8,次设备号是1,因为Makefile是在sda1分区上,sda1分区又属于sda硬盘
    主设备号用来区分不同的设备,次设备号用来区分同一设备中不同小类别,比如磁盘中不同的分区,sda1分区1,sda2分区2,sda硬盘的主设备号是8。
    主设备号解决了什么的驱动程序访问设备
    在这里插入图片描述
    通过ls -l /dev/tty2可以看到他的主设备号是4,次设备号是2
    在这里插入图片描述
    Makefile文件的inode号
    在这里插入图片描述
    普通文件和字符设备文件打印(终端是字符设备文件)
    在这里插入图片描述
    Makefile的权限是644
    在这里插入图片描述

  • Makefile

.PHONY:clean all
CC=gcc
CFLAGS=-Wall -g
BIN=01stat
all:$(BIN)
%.o:%.c$(CC) $(CFLAGS) -c $< -o $@
clean:rm -f *.o $(BIN)

4.实现ls -l功能需要的函数

  • lstat
  • getpwuid
    获取uid
  • getgrgid
    获取组id
  • readlink
man 2 readlinkssize_t readlink(const char *path, char *buf, size_t bufsiz);
由path获取其所指向的文件,保存在buf里

这篇关于(P6)文件与IO:stat、stat结构体的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1041401

相关文章

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

Java集合中的链表与结构详解

《Java集合中的链表与结构详解》链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序的通过链表中的引用链接次序实现,文章对比ArrayList与LinkedList的结构差异,详细讲解了链表... 目录一、链表概念与结构二、当向单链表的实现2.1 准备工作2.2 初始化链表2.3 打印数据、链表长

创建springBoot模块没有目录结构的解决方案

《创建springBoot模块没有目录结构的解决方案》2023版IntelliJIDEA创建模块时可能出现目录结构识别错误,导致文件显示异常,解决方法为选择模块后点击确认,重新校准项目结构设置,确保源... 目录创建spChina编程ringBoot模块没有目录结构解决方案总结创建springBoot模块没有目录

SpringBoot利用树形结构优化查询速度

《SpringBoot利用树形结构优化查询速度》这篇文章主要为大家详细介绍了SpringBoot利用树形结构优化查询速度,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一个真实的性能灾难传统方案为什么这么慢N+1查询灾难性能测试数据对比核心解决方案:一次查询 + O(n)算法解决

Oracle查询表结构建表语句索引等方式

《Oracle查询表结构建表语句索引等方式》使用USER_TAB_COLUMNS查询表结构可避免系统隐藏字段(如LISTUSER的CLOB与VARCHAR2同名字段),这些字段可能为dbms_lob.... 目录oracle查询表结构建表语句索引1.用“USER_TAB_COLUMNS”查询表结构2.用“a

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2

如何使用Maven创建web目录结构

《如何使用Maven创建web目录结构》:本文主要介绍如何使用Maven创建web目录结构的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录创建web工程第一步第二步第三步第四步第五步第六步第七步总结创建web工程第一步js通过Maven骨架创pytho

Python循环结构全面解析

《Python循环结构全面解析》循环中的代码会执行特定的次数,或者是执行到特定条件成立时结束循环,或者是针对某一集合中的所有项目都执行一次,这篇文章给大家介绍Python循环结构解析,感兴趣的朋友跟随... 目录for-in循环while循环循环控制语句break语句continue语句else子句嵌套的循

如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socket read timed out的问题

《如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socketreadtimedout的问题》:本文主要介绍解决Druid线程... 目录异常信息触发场景找到版本发布更新的说明从版本更新信息可以看到该默认逻辑已经去除总结异常信息触发场景复

Python+PyQt5实现文件夹结构映射工具

《Python+PyQt5实现文件夹结构映射工具》在日常工作中,我们经常需要对文件夹结构进行复制和备份,本文将带来一款基于PyQt5开发的文件夹结构映射工具,感兴趣的小伙伴可以跟随小编一起学习一下... 目录概述功能亮点展示效果软件使用步骤代码解析1. 主窗口设计(FolderCopyApp)2. 拖拽路径