stat命令

stat既有命令也有同名函数,用来获取文件Inode里主要信息,所以stat命令的输出信息比ls命令的输出信息要更详细,stat 跟踪符号链接,lstat不跟踪符号链接,其中会输出对应文件的文件名(File)、文件大小(Size)、占用物理扇区数(Blocks)、系统块大小(IO Block)、文件类型(前一篇博客中介绍的)、设备的主编号和次编号(Device做驱动程序时经常用到,在系统层面几乎用不到吧)、文件索引号(Inode文件节点)、硬链接个数(Links)、权限(Access)、用户id(Uid)、组id(Gid)、还有三个重要的时间。

stat里面时间辨析:

atime(最近访问时间access time): 最近打开文件的时间,读一次这个文件的内容,这个时间就会更新。比如对这个文件运用 more、cat等命令。但是ls、stat命令都不会修改文件的访问时间(在上一篇博客中已经介绍原因)。
mtime(最近更改时间modifiy time): 指最近修改文件内容的时间 ,修改时间,修改时间是文件内容最后一次被修改时间。比如:vi后保存文件。ls -l列出的时间就是这个时间。
ctime(最近改动时间change time): 指最近改动Inode的时间,状态改动时间。是该文件的i节点最后一次被修改的时间,通过chmod、chown命令修改一次文件属性,这个时间就会更新。

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char *path, struct stat *buf);
int fstat(int fd, struct stat *buf);
int lstat(const char *path, struct stat *buf);
struct stat {
dev_t st_dev; /* ID of device containing file 文件的设备编号*/
ino_t st_ino; /* inode number 文件索引号(Inode文件节点)*/
mode_t st_mode; /* protection 文件的类型和存取的权限*/
nlink_t st_nlink; /* number of hard links 连到该文件的硬连接数目, 刚建立的文件值为1.*/
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 file system I/O 文件系统的I/O 缓冲区大小*/
blkcnt_t st_blocks; /* number of 512B blocks allocated 占用文件区块的个数, 每一区块大小为512 个字节*/
time_t st_atime; /* time of last access 文件最近一次被存取或被执行的时间*/
time_t st_mtime; /* time of last modification 文件最后一次被修改的时间*/
time_t st_ctime; /* time of last status change 最近一次被更改的时间*/
};

access函数

头文件:#include < unistd.h>

定义函数:int access(const char * pathname, int mode);

函数说明:access()会检查是否可以读/写某一已存在的文件。

参数mode 有几种情况组合:
1、R_OK, W_OK, X_OK和F_OK. R_OK, W_OK 与X_OK 用来检查文件是否具有读取写入和执行的权限。
2、F_OK 则是用来判断该文件是否存在。由于access()只作权限的核查, 并不理会文件形态或文件内容,因此,如果一目录表示为”可写入”,表示可以在该目录中建立新文件等操作,而非意味此目录可以被当做文件处理。例如:你会发现DOS 的文件都具有”可执行”权限,但用execve()执行时则会失败。

返回值:若所有欲查核的权限都通过了检查则返回0 值,表示成功,只要有一权限被禁止则返回-1。

错误代码:
1、EACCESS 参数pathname 所指定的文件不符合所要求测试的权限.
2、EROFS 欲测试写入权限的文件存在于只读文件系统内.
3、EFAULT 参数pathname 指针超出可存取内存空间.
4、EINVAL 参数mode 不正确.
5、ENAMETOOLONG 参数pathname 太长.
6、ENOTDIR 参数pathname 为一目录.
7、ENOMEM 核心内存不足
8、ELOOP 参数pathname 有过多符号连接问题.
9、EIO I/O 存取错误.

#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> int main(int argc, char *argv[])
{
//R_OK 是否有读权限
//W_OK 是否有写权限
//X_OK 是否有执行权限
//F_OK 测试一个文件是否存在
if(access("abc",F_OK) <)
{
perror("abc");
exit();
} printf("abc is ok\n"); return ;
}

文件系统之 stat与access的更多相关文章

  1. Linux下编译内核配置选项简介

    Code maturity level options代码成熟度选项 Prompt for development and/or incomplete code/drivers 显示尚在开发中或尚未完 ...

  2. python模块-OS模块详解

    1.按字母分 os相关的函数:143个.按字母排序如下: ['abort', 'access', 'altsep', 'chdir', 'chmod', 'chown', 'chroot', 'clo ...

  3. MySQL数据库基础学习

    MySQL基础知识 ----------- MySQL数据库简介 内存:一断电数据就没有了---------数据库:可以实现数据的持久化存储,有完整的管理系统管理,方便查询--------- DB:数 ...

  4. linux内核剖析(六)Linux系统调用详解(实现机制分析)

    本文介绍了系统调用的一些实现细节.首先分析了系统调用的意义,它们与库函数和应用程序接口(API)有怎样的关系.然后,我们考察了Linux内核如何实现系统调用,以及执行系统调用的连锁反应:陷入内核,传递 ...

  5. Linux: 介绍make menuconfig中的每个选项含义【转】

    转自:http://blog.csdn.net/gaoyuanlinkconcept/article/details/8810468 介绍make menuconfig中的每个选项含义 Linux 2 ...

  6. mongodb集群性能优化

    mongodb集群性能优化 在前面两篇文章,我们介绍了如何去搭建mongodb集群,这篇文章我们将介绍如何去优化mongodb的各项配置,以达到最优的效果. 警告 不做任何的优化,集群搭建完成之后,使 ...

  7. Spark记录-实例和运行在Yarn

    #运行实例 #./bin/run-example SparkPi 10   #./bin/spark-shell --master local[2] #./bin/pyspark --master l ...

  8. 【内核】linux2.6版本内核编译配置选项(二)

    目录 Linux2.6版本内核编译配置选项(一):http://infohacker.blog.51cto.com/6751239/1203633 Linux2.6版本内核编译配置选项(二):http ...

  9. python中os模块中文帮助

    python中os模块中文帮助   python中os模块中文帮助文档文章分类:Python编程 python中os模块中文帮助文档 翻译者:butalnd 翻译于2010.1.7——2010.1.8 ...

随机推荐

  1. PL/SQL 用户自定义子类型

    子类型具有与其基本类型相同的操作,但只有基本类型有效值的子集. 例如,PL/SQL预先定义子类型CHARACTER和INTEGER,如下所示: SUBTYPE CHARACTER IS CHAR; S ...

  2. 使用js获取表单元素的值

    function getParams(formName) { var frmMain = document.getElementById(formName)?document.getElementBy ...

  3. C++定义一个简单的Computer类

    /*定义一个简单的Computer类 有数据成员芯片(cpu).内存(ram).光驱(cdrom)等等, 有两个公有成员函数run.stop.cpu为CPU类的一个对象, ram为RAM类的一个对象, ...

  4. ABAP术语-Object Name

    Object Name 原文:http://www.cnblogs.com/qiangsheng/archive/2008/03/05/1091092.html An object name is a ...

  5. python排序算法的整理

    #冒泡排序,主要思想:从第一个元素开始,向尾部开始比较大小换位置 def bubble_sort(alist): for j in range(len(alist)-1,0,-1): for i in ...

  6. Laravel系列之CMS系统学习 — 角色、权限配置【2】

    一.RBAC分析 基于角色的权限访问控制(Role-Based Access Control),这里存在这么几个玩意儿:角色.权限,用户 表:roles.permissions.role_has_pe ...

  7. hive 学习系列三(表格的创建create-table)

    表格创建: 语法 第一种建表的形式: 说明: temporary 临时表,在当前回话内,这张表有效,当回话结束,可以理解为程序结束,则程序终止. external 外部表, hdfs 上的表的文件,并 ...

  8. 8-C++远征之继承篇-学习笔记

    C++远征之继承篇 开篇介绍 整个C++远征计划: 起航->离港->封装->继承 为什么要用继承? 为什么要有继承? 如何来定义基类 <----> 派生类? 基类到派生类 ...

  9. vue---day01

    1.let和const var 全局作用域和函数作用域 存在变量提升 其实是个bug 可以重复声明 let 块级作用域 不存在变量提升 不能重复声明 const 常量 和let一样还有另外两个 定义的 ...

  10. Go语言中的UDP应用

    Go语言中的UDP应用 Go语言中使用UDP是很方便的,net包提供了UDP和TCP的功能,这里使用UDP做了一个UDP广播,然后接收各个设备的返回信息.实现起来很快,总体感觉比使用C#中的UDP更优 ...