(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

相关文章

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

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

Python文件操作与IO流的使用方式

《Python文件操作与IO流的使用方式》:本文主要介绍Python文件操作与IO流的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、python文件操作基础1. 打开文件2. 关闭文件二、文件读写操作1.www.chinasem.cn 读取文件2. 写

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

使用Java实现通用树形结构构建工具类

《使用Java实现通用树形结构构建工具类》这篇文章主要为大家详细介绍了如何使用Java实现通用树形结构构建工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录完整代码一、设计思想与核心功能二、核心实现原理1. 数据结构准备阶段2. 循环依赖检测算法3. 树形结构构建4. 搜索子

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据

《mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据》文章主要介绍了如何从.frm和.ibd文件恢复MySQLInnoDB表结构和数据,需要的朋友可以参... 目录一、恢复表结构二、恢复表数据补充方法一、恢复表结构(从 .frm 文件)方法 1:使用 mysq

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

python中os.stat().st_size、os.path.getsize()获取文件大小

《python中os.stat().st_size、os.path.getsize()获取文件大小》本文介绍了使用os.stat()和os.path.getsize()函数获取文件大小,文中通过示例代... 目录一、os.stat().st_size二、os.path.getsize()三、函数封装一、os

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者