linux stat函数讲解(整理)

stat函数讲解

表头文件:

 #include <sys/stat.h>
#include <unistd.h>

定义函数:

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

函数说明:

通过文件名filename获取文件信息,并保存在buf所指的结构体stat中

返回值:

执行成功则返回0,失败返回-1,错误代码存于errno

错误代码:

ENOENT         参数file_name指定的文件不存在
    ENOTDIR        路径中的目录存在但却非真正的目录
    ELOOP          欲打开的文件有过多符号连接问题,上限为16符号连接
    EFAULT         参数buf为无效指针,指向无法存在的内存空间
    EACCESS        存取文件时被拒绝
    ENOMEM         核心内存不足
    ENAMETOOLONG   参数file_name的路径名称太长

#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
int main() {
  struct stat buf;
  stat("/etc/hosts", &buf);
  printf("/etc/hosts file size = %d\n", buf.st_size);
}

-----------------------------------------------------

struct stat {
  dev_t     st_dev;    //文件的设备编号
  ino_t     st_ino;    //节点
  mode_t    st_mode;   //文件的类型和存取的权限
  nlink_t    st_nlink;   //连到该文件的硬连接数目,刚建立的文件值为1
  uid_t     st_uid;    //用户ID
  gid_t     st_gid;    //组ID
  dev_t     st_rdev;   //(设备类型)若此文件为设备文件,则为其设备编号
  off_t     st_size;   //文件字节数(文件大小)
  unsigned long st_blksize;  //块大小(文件系统的I/O 缓冲区大小)
  unsigned long st_blocks;  //块数
  time_t    st_atime;   //最后一次访问时间
  time_t    st_mtime;   //最后一次修改时间
  time_t    st_ctime;   //最后一次改变时间(指属性)
};

先前所描述的st_mode 则定义了下列数种情况:

S_IFMT   0170000    文件类型的位遮罩
    S_IFSOCK 0140000    scoket
    S_IFLNK 0120000     符号连接
    S_IFREG 0100000     一般文件
    S_IFBLK 0060000     区块装置
    S_IFDIR 0040000     目录
    S_IFCHR 0020000     字符装置
    S_IFIFO 0010000     先进先出
    S_ISUID 04000     文件的(set user-id on execution)位
    S_ISGID 02000     文件的(set group-id on execution)位
    S_ISVTX 01000     文件的sticky位
    S_IRUSR(S_IREAD) 00400     文件所有者具可读取权限
    S_IWUSR(S_IWRITE)00200     文件所有者具可写入权限
    S_IXUSR(S_IEXEC) 00100     文件所有者具可执行权限
    S_IRGRP 00040             用户组具可读取权限
    S_IWGRP 00020             用户组具可写入权限
    S_IXGRP 00010             用户组具可执行权限
    S_IROTH 00004             其他用户具可读取权限
    S_IWOTH 00002             其他用户具可写入权限
    S_IXOTH 00001             其他用户具可执行权限

上述的文件类型在POSIX中定义了检查这些类型的宏定义:

S_ISLNK (st_mode)    判断是否为符号连接
    S_ISREG (st_mode)    是否为一般文件
    S_ISDIR (st_mode)    是否为目录
    S_ISCHR (st_mode)    是否为字符装置文件
    S_ISBLK (s3e)        是否为先进先出
    S_ISSOCK (st_mode)   是否为socket

若一目录具有sticky位(S_ISVTX),则表示在此目录下的文件只能被该文件所有者、此目录所有者或root来删除或改名。

-----------------------------------------------------

struct statfs {
  long  f_type;     //文件系统类型
  long  f_bsize;     //块大小
  long  f_blocks;    //块多少
  long  f_bfree;     //空闲的块
  long  f_bavail;    //可用块
  long  f_files;     //总文件节点
  long  f_ffree;     //空闲文件节点
  fsid_t f_fsid;      //文件系统id
  long  f_namelen;    //文件名的最大长度
  long  f_spare[6];   //spare for later
};

stat、fstat和lstat函数(UNIX)

#include<sys/types.h>
#include<sys/stat.h>
int stat(const char *restrict pathname, struct stat *restrict buf);

提供文件名字,获取文件对应属性。感觉一般是文件没有打开的时候这样操作。

int fstat(int filedes, struct stat *buf);

通过文件描述符获取文件对应的属性。文件打开后这样操作

int lstat(const char *restrict pathname, struct stat *restrict buf);

连接文件

三个函数的返回:若成功则为0,若出错则为-1

给定一个pathname,stat函数返回一个与此命名文件有关的信息结构,fstat函数获得已在描述符filedes上打开的文件的有关信息。lstat函数类似于stat,但是当命名的文件是一个符号连接时,lstat返回该符号连接的有关信息,而不是由该符号连接引用的文件的信息。

第二个参数是个指针,它指向一个我们应提供的结构。这些函数填写由buf指向的结构。该结构的实际定义可能随实现而有所不同,但其基本形式是:

struct stat{
mode_t st_mode;  /*file tpye &mode (permissions)*/
ino_t st_ino;   /*i=node number (serial number)*/
dev_t st_rdev;  /*device number for special files*/
nlink_t st_nlink; /*number of links*/
uid_t  st_uid; /*user id of owner*/
gid_t  st_gid; /*group ID of owner*/
off_t  st_size; /*size in bytes for regular files*/
time_t st_atime; /*time of last access*/
time_t st_mtime; /*time of last modification*/
time_t st_ctime; /*time of last file status change*/
long st_blksize; /*best I/O block size */
long st_blocks; /*number of 512-byte blocks allocated*/
};

注意,除最后两个以外,其他各成员都为基本系统数据类型。我们将说明此结构的每个成员以了解文件属性。

使用stat函数最多的可能是ls-l命令,用其可以获得有关一个文件的所有信息。

1 函数都是获取文件(普通文件,目录,管道,socket,字符,块()的属性。

函数原型

#include <sys/stat.h>
int stat(const char *restrict pathname, struct stat *restrict buf);

提供文件名字,获取文件对应属性。

int fstat(int filedes, struct stat *buf);

通过文件描述符获取文件对应的属性。

int lstat(const char *restrict pathname, struct stat *restrict buf);

连接文件描述命,获取文件属性。

2 文件对应的属性

struct stat {
    mode_t   st_mode;    //文件对应的模式,文件,目录等
    ino_t   st_ino;    //inode节点号
    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;   //伟建内容对应的块数量
   };

可以通过上面提供的函数,返回一个结构体,保存着文件的信息。

以上所述是小编给大家介绍的linux stat函数讲解(整理),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Linux下用netstat查看网络状态、端口状态

    在linux一般使用netstat 来查看系统端口使用情况步. netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表.实际的网络连接以及每一个网络接口设备的 netstat命令的功能是显示网络连接.路由表和网络接口信息,可以让用户得知目前都有哪些网络连接正在运作. 该命令的一般格式为: netstat [选项] 命令中各选项的含义如下: -a 显示所有socket,包括正在监听的. -c 每隔1秒就重新显示一遍,直到用户中断它. -i 显示所有网络接口的信息,格式同"i

  • Linux vmstat命令实战详细解析

    vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况.这个命令是我查看Linux/Unix最喜爱的命令,一个是Linux/Unix都支持,二是相比top,我可以看到整个机器的CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率(使用场景不一样). 一般vmstat工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数,

  • linux系统下一个冷门的RAID卡ioc0及其监控mpt-status

    新接手了一台Linux服务器,准备检查是否有配置RAID.   先查看是否有RAID卡: 复制代码 代码如下: # dmesg|grep -i raid mptsas: ioc0: attaching raid volume, channel 1, id 0 device-mapper: dm-raid45: initialized v0.2594l md: Autodetecting RAID arrays. 很明显是有的,只是无法确定RAID卡的类型是ioc0还是dm-raid45,于是开始

  • Linux系统下导出ORACLE数据库出现Exporting questionable statistics.错误 处理

    环境:A机器和B机器都是LINUX系统,但由于B机器已经空间不足,所以停掉不停操作数据库的服务后 ,准备在A机器进行导出操作. 导出语句 exp user/password@sid file=0320.dmp 导出过程中不停出现Exporting questionable statistics.的错误. 上网一查,都说是字符集问题. 使用语句查看数据库的字符集. select *from nls_database_parameters t where t.parameter='NLS_CHARA

  • Linux中使用mysqladmin extended-status配合Linux命令查看MySQL运行状态

    mysqladmin是MySQL一个重要的客户端,最常见的是使用它来关闭数据库,除此,该命令还可以了解MySQL运行状态.进程信息.进程杀死等.本文介绍一下如何使用mysqladmin extended-status(因为没有"歧义",所以可以使用ext代替)了解MySQL的运行状态. 1. 使用-r/-i参数 使用mysqladmin extended-status命令可以获得所有MySQL性能指标,即show global status的输出,不过,因为多数这些指标都是累计值,如果

  • Linux netstat命令查看并发连接数的方法

    介绍 并发连接数是指防火墙或代理服务器对其业务信息流的处理能力,是防火墙能够同时处理的点对点连接的最大数目,它反映出防火墙设备对多个连接的访问控制能力和连接状态跟踪能力,这个参数的大小直接影响到防火墙所能支持的最大信息点数. 实现方法 使用以下命令即可分组查看各种连接状态哦: netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 解释: 返回结果示例: LAST_ACK 5 (正在等待处理的请求数) SYN_RE

  • Linux netstat命令详细解析

    简介Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等. 输出信息含义执行netstat后,其输出结果为 复制代码 代码如下: Active Internet connections (w/o servers)Proto Recv-Q Send-Q Local Address Foreign Address Statetcp 0 2 2

  • VMware Workstation/Fusion 中安装 Fedora 23/24 及其他 Linux 系统时使用 Open VM Tools 代替 VMware Tools 增强工具的方法

    VMware Workstation/Fusion 分别是 Windows/Linux 和 macOS 下面对应的桌面虚拟化软件.过去,在 VMware 中安装了操作系统虚拟机后,需要在虚拟机中再安装 VMware Tools 增强工具用来实现宿主机和虚拟机之间的文件共享.虚拟机显示分辨率自适应调节.虚拟机显示能力增强及 3D 加速等功能. 但随着 Linux 系统内核及周边环境的不断发展,目前 VMware 已经不再推荐在 Linux 虚拟机中安装 VMware 官方的增强工具了,转而推荐用户

  • linux stat函数讲解(整理)

    stat函数讲解 表头文件: #include <sys/stat.h> #include <unistd.h> 定义函数: int stat(const char *file_name, struct stat *buf); 函数说明: 通过文件名filename获取文件信息,并保存在buf所指的结构体stat中 返回值: 执行成功则返回0,失败返回-1,错误代码存于errno 错误代码: ENOENT         参数file_name指定的文件不存在     ENOTDI

  • PHP超级全局变量、魔术变量和魔术函数汇总整理

    PHP在设计的时候已经预定义了9个超级全局变量.8个魔术变量和13魔术函数,这些变量和函数可以在脚本的任何地方不用声明就可以使用. 在PHP开发会频繁的使用这些变量和函数,这些变量和函数可以方便的帮我们解决很多问题.下面详细的讲解下PHP中的超级全局变量.魔术变量和魔术函数. PHP超级全局变量(9个) $GLOBALS:储存全局作用域中的变量 $_SERVER:获取服务器相关信息 $_REQUEST:获取POST和GET请求的参数 $_POST:获取表单的POST请求参数 $_GET:获取表单

  • C语言 pthread_create() 函数讲解

    pthread_create()函数详解 pthread_create是类Unix操作系统(Unix.Linux.Mac OS X等)的创建线程的函数.它的功能是创建线程(实际上就是确定调用该线程函数的入口点),在线程创建以后,就开始运行相关的线程函数. 头文件: #include<pthread.h> 函数原型: int pthread_create (pthread_t * tidp, const pthread_attr_t * attr, void * (*start_rtn)(voi

  • jQuery中常用动画效果函数(日常整理)

    jquery中动画效果非常多,下面小编给大家分享一下jquery中的动画函数. jQuery的效果函数列表: animate():对被选元素应用"自定义"的动画. clearQueue():对被选元素移除所有排队的函数(仍未运行的). delay():对被选元素的所有排队函数(仍未运行)设置延迟. dequeue():运行被选元素的下一个排队函数. fadeln():逐渐改变被选元素的不透明度,从隐藏到可见. fadeOut():逐渐改变被元素的不透明度,从可见到隐藏. fadeTo(

  • 深入解读Linux进程函数fork(),vfork(),execX()

    本文研究的主要是Linux进程函数fork(),vfork(),execX()的相关内容,具体介绍如下. 函数fork() fork函数:创建一个新进程 1.fork()成功后,将为子进程申请PCB和用户内存空间. 2.子进程会复制父进程用户空间的所有数据(代码段.数据段.BSS.堆.栈),文件描述符. 3.复制父亲进程PCB中绝大多数信息. 4.虽然子进程复制了文件描述符,而对于文件描述符相关的文件表项(struct file结构),则采用共享的方式. 一个实例: #include <unis

  • Linux unlink函数和删除文件的操作方法

    1. unlink函数   对于硬链接来说,unlink 用来删除目录项,并把 inode 引用计数减 1,这两步也是一个原子过程.直到 inode 引用计数为 0,才会真正删除文件.   对于软链接来说,unlink 直接删除软链接,而不影响软链接指向的文件. 函数原型: int unlink(const char *pathname);   参数说明:   pathname:指定要移除的链接文件 返回值说明:   成功返回0:失败则返回-1,同时设置errno为相应值 2. 实验代码-myu

  • FreeRTOS实时操作系统队列的API函数讲解

    目录 FreeRTOS为操作队列提供了非常丰富的API函数,包括队列的创建.删除,灵活的入队和出队方式.带中断保护的入队和出队等等.下面就来详细讲述这些API函数. 1.获取队列入队信息数目1.1函数描述 UBaseType_t uxQueueMessagesWaiting( QueueHandle_t xQueue ); 返回队列中存储的信息数目.具有中断保护的版本为uxQueueMessagesWaitingFromISR(),原型为:UBaseType_t uxQueueMessagesW

  • linux时间函数与时间格式与字符串之间的转化方法

    我们可以认为格林威治时间就是时间协调时间(GMT=UTC) GMT : 格林威治时间 UTC : 时间协调时间 1.time_t time_t time(time_t *t); 取得从1970年1月1日至今的秒数. time_t类型,这本质上是一个长整数( long ),表示从1970-01-01 00:00:00到目前计时时间的秒数,timeval则精确到毫秒 2.timeval timeval类型,这是一个结构体类型,struct timeval 头文件为 time.h struct tim

  • Golang的os标准库中常用函数的整理介绍

    os.Rename()这个函数的原型是func Rename(oldname, newname string) error,输入的是旧文件名,新文件名,然后返回一个error其实这个函数的真正实现用的syscall.Rename()然后通过MoveFile(from *uint16, to *uint16) (err error) = MoveFileW来重新命名 复制代码 代码如下: import (  "fmt"  "os" ) func main() {  e

  • javascript常用函数归纳整理

    本文整理归纳了一些js常用函数,其中包括对数据操作,字符替换操作,日期及加解密操作函数,还有一些简单的验证函数.便于大家查阅参考.相信对大家会有所帮助. 1.typeof.constructor.instanceof对数组的判断 复制代码 代码如下: var arr = [1,5,6,9,8,5,4]; //var arr = new Array(1,5,6,9,8,5,4); console.log(typeof arr);//object console.log(arr.constructo

随机推荐