(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

相关文章

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

OpenCV结构分析与形状描述符(11)椭圆拟合函数fitEllipse()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆,该椭圆在最小二乘意义上最好地拟合一组2D点。它返回一个内切椭圆的旋转矩形。使用了由[90]描述的第一个算法。开发者应该注意,由于数据点靠近包含的 Mat 元素的边界,返回的椭圆/旋转矩形数据

Java IO 操作——个人理解

之前一直Java的IO操作一知半解。今天看到一个便文章觉得很有道理( 原文章),记录一下。 首先,理解Java的IO操作到底操作的什么内容,过程又是怎么样子。          数据来源的操作: 来源有文件,网络数据。使用File类和Sockets等。这里操作的是数据本身,1,0结构。    File file = new File("path");   字

springboot体会BIO(阻塞式IO)

使用springboot体会阻塞式IO 大致的思路为: 创建一个socket服务端,监听socket通道,并打印出socket通道中的内容。 创建两个socket客户端,向socket服务端写入消息。 1.创建服务端 public class RedisServer {public static void main(String[] args) throws IOException {

Java基础回顾系列-第七天-高级编程之IO

Java基础回顾系列-第七天-高级编程之IO 文件操作字节流与字符流OutputStream字节输出流FileOutputStream InputStream字节输入流FileInputStream Writer字符输出流FileWriter Reader字符输入流字节流与字符流的区别转换流InputStreamReaderOutputStreamWriter 文件复制 字符编码内存操作流(

C语言程序设计(选择结构程序设计)

一、关系运算符和关系表达式 1.1关系运算符及其优先次序 ①<(小于) ②<=(小于或等于) ③>(大于) ④>=(大于或等于 ) ⑤==(等于) ⑥!=(不等于) 说明: 前4个优先级相同,后2个优先级相同,关系运算符的优先级低于算术运算符,关系运算符的优先级高于赋值运算符 1.2关系表达式 用关系运算符将两个表达式(可以是算术表达式或关系表达式,逻辑表达式,赋值表达式,字符

Science|癌症中三级淋巴结构的免疫调节作用与治疗潜力|顶刊精析·24-09-08

小罗碎碎念 Science文献精析 今天精析的这一篇综述,于2022-01-07发表于Science,主要讨论了癌症中的三级淋巴结构(Tertiary Lymphoid Structures, TLS)及其在肿瘤免疫反应中的作用。 作者类型作者姓名单位名称(中文)通讯作者介绍第一作者Ton N. Schumacher荷兰癌症研究所通讯作者之一通讯作者Daniela S. Thomm

oracle11.2g递归查询(树形结构查询)

转自: 一 二 简单语法介绍 一、树型表结构:节点ID 上级ID 节点名称二、公式: select 节点ID,节点名称,levelfrom 表connect by prior 节点ID=上级节点IDstart with 上级节点ID=节点值 oracle官网解说 开发人员:SQL 递归: 在 Oracle Database 11g 第 2 版中查询层次结构数据的快速

android java.io.IOException: open failed: ENOENT (No such file or directory)-api23+权限受权

问题描述 在安卓上,清单明明已经受权了读写文件权限,但偏偏就是创建不了目录和文件 调用mkdirs()总是返回false. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_E