嵌入式 Linux系统编程(四)——文件属性

嵌入式 Linux系统编程(四)——文件属性

一、文件属性概述

Linux 文件的属性主要包括:文件的节点、种类、权限模式、链接数量、所归属的用户和用户组、最近访问或修改的时间等内容。文件属性示例如下:

多个文件属性查看:

ls -lih

1341714 -rw-r--r-- 1 root root 2.5K May 28 10:24 bit_marco.c

1341718 -rw-r--r-- 1 root root 2.1K May 28 09:08 bit_marco.c~

1341706 -rw-r--r-- 1 root root 2.6K May 28 08:54 bit_operaion.c

1335906 -rwxr-xr-x 1 root root 7.2K May 30 04:06 file

1341722 -rw-r--r-- 1 root root 2.7K May 30 04:06 file.c

1321584 -rw-r--r-- 1 root root 2.7K May 30 04:04 file.c~

1341708 -rwxr-xr-x 1 root root 6.4K May 28 09:08 main

1335846 -rw-r--r-- 1 root root 2.6K May 28 08:55 main.c

第一字段:inode

第二字段:文件类型和权限

第三字段:硬链接数

第四字段:所属用户

第五字段:所属用户组

第六字段:文件大小

第七字段:最后访问或修改时间

第八字段:文件名

单个文件属性详细查看:

root#stat file

File: `file‘

Size: 7308            Blocks: 16         IO Block: 4096   regular file

Device: fd00h/64768d    Inode: 1335906     Links: 1

Access: (0755/-rwxr-xr-x)  Uid: (0/root)   Gid: (0/root)

Access: 2016-05-30 04:06:10.151098056 -0400

Modify: 2016-05-30 04:06:07.227089617 -0400

Change: 2016-05-30 04:06:07.227089617 -0400

二、文件属性函数

#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);

成功返回0,错误返回-1,并设置errno全局变量

文件属性数据结构:

struct stat {

dev_t     st_dev;     /* ID of device containing file */

ino_t     st_ino;     /* inode number */

mode_t    st_mode;    /* protection */

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 file system I/O */

blkcnt_t  st_blocks;  /* number of 512B blocks allocated */

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 */

};

1、stat

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

path:文件的路径,buf:指向存储文件信息的数据结构的指针

2、fstat

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

fd:文件描述符,buf:指向存储文件信息的数据结构的指针

3、lstat

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

path:文件的路径,buf:指向存储文件信息的数据结构的指针

用于查阅链接文件的文件属性

三、文件权限信息提取

文件的文件类型和文件权限存在于文件属性数据结构中的st_mode成员。为了使用st_mode检查文件类型,POSIX标准定义了如下的宏:

S_ISREG(m)  is it a regular file?

S_ISDIR(m)  directory?

S_ISCHR(m)  character device?

S_ISBLK(m)  block device?

S_ISFIFO(m) FIFO (named pipe)?

S_ISLNK(m)  symbolic link? (Not in POSIX.1-1996.)

S_ISSOCK(m) socket? (Not in POSIX.1-1996.)

S_IFMT     0170000   bit mask for the file type bit fields

S_IFSOCK   0140000   socket

S_IFLNK    0120000   symbolic link

S_IFREG    0100000   regular file

S_IFBLK    0060000   block device

S_IFDIR    0040000   directory

S_IFCHR    0020000   character device

S_IFIFO    0010000   FIFO

S_ISUID    0004000   set UID bit

S_ISGID    0002000   set-group-ID bit (see below)

S_ISVTX    0001000   sticky bit (see below)

S_IRWXU    00700     mask for file owner permissions//用户权限掩码

S_IRUSR    00400     owner has read permission

S_IWUSR    00200     owner has write permission

S_IXUSR    00100     owner has execute permission

S_IRWXG    00070     mask for group permissions//组权限掩码

S_IRGRP    00040     group has read permission

S_IWGRP    00020     group has write permission

S_IXGRP    00010     group has execute permission

S_IRWXO    00007     mask for permissions for others //掩码

S_IROTH    00004     others have read permission

S_IWOTH    00002     others have write permission

S_IXOTH    00001     others have execute permission

文件类型的获取:

int get_stat_type(const struct stat *st, char *buf)

{

if(S_ISREG(st->st_mode))

{

sprintf(buf, "regular file");

}

if(S_ISDIR(st->st_mode))

{

sprintf(buf, "directory");

}

if(S_ISCHR(st->st_mode))

{

sprintf(buf, "charactor device");

}

if(S_ISBLK(st->st_mode))

{

sprintf(buf, "block device");

}

if(S_ISFIFO(st->st_mode))

{

sprintf(buf, "fifo file");

}

if(S_ISLNK(st->st_mode))

{

sprintf(buf, "symbloc link");

}

if(S_ISSOCK(st->st_mode))

{

sprintf(buf, "socket");

}

return 0;

}

四、程序实例

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
 
 
int print_stat(struct stat *st);
 
int main(int argc, char **argv)
{
    if(argc < 2)
    {   
        fprintf(stderr, "argc is less than 2\n");
        fprintf(stdout, "please enter: appname filename");
        return -1; 
    }   
    struct stat s;
    bzero(&s, sizeof(struct stat));
    stat(argv[1], &s);
    print_stat(&s);
    return 0;
}
 
int print_stat(struct stat *st)
{
    if(NULL == st)
    {
        fprintf(stderr, "struct stat *st is NULL\n");
        exit(-1);
    }
    printf("The device no is: %d\n", st->st_dev);
    printf("The file‘s node number is: %d\n", st->st_ino);
    printf("The file‘s access mode is: %d\n", st->st_mode);
    printf("The file‘s hard link number is: %d\n", st->st_nlink);
    printf("The file‘s user id is: %d\n", st->st_uid);
    printf("The file‘s group id is: %d\n", st->st_gid);
    printf("The file‘s size is: %d\n", st->st_size);
    printf("The block size is: %d\n", st->st_blksize);
    printf("The number of allocated blocks is: %d\n", st->st_blocks);
 
    struct tm* pAccess_time=localtime(&(st->st_atime));
    struct tm* pModify_time=localtime(&(st->st_mtime));
    struct tm* pChange_time=localtime(&(st->st_ctime));
    char aBuffer[64] = {0};
    char mBuffer[64] = {0};
    char cBuffer[64] = {0};
    strftime(aBuffer, 64, "The last access time is: %Y-%m-%d %H:%M:%S \n", pAccess_time);
    strftime(mBuffer, 64, "The last modify time is: %Y-%m-%d %H:%M:%S \n", pModify_time);
    strftime(cBuffer, 64, "The last change time is: %Y-%m-%d %H:%M:%S \n", pChange_time);
 
    printf(aBuffer);
    printf(mBuffer);
printf(cBuffer);
return 0;
}
时间: 2024-10-27 07:10:35

嵌入式 Linux系统编程(四)——文件属性的相关文章

嵌入式 Linux系统编程(一)——文件IO

嵌入式 Linux系统编程(一)--文件IO 一.文件IO概念 linux文件IO操作有两套大类的操作方式:不带缓存的文件IO操作,带缓存的文件IO操作.不带缓存的属于直接调用系统调用(system call)的方式,高效完成文件输入输出.它以文件标识符(整型)作为文件唯一性的判断依据.这种操作不是ASCI标准的,与系统有关,移植有一定的问题.而带缓存的是在不带缓存的基础之上封装了一层,维护了一个输入输出缓冲区,使之能跨OS,成为ASCI标准,称为标准IO库.不带缓存的方式频繁进行用户态 和内核

嵌入式 Linux系统编程(二)——文件描述符控制函数fcntl

嵌入式 Linux系统编程(二)--文件描述符控制函数fcntl 由于fcntl函数实在过于灵活和复杂,本文将fcntl函数从文件IO中单独列出来,便于详细解读.函数原型如下: #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd, ... /* arg */ ); fcntl函数用于控制操作文件描述符fd,对文件描述符的控制操作由cmd控制命令来控制,arg参数为可选参数,是否需要arg参数取决于控制命令

嵌入式 Linux系统编程(三)——标准IO库

嵌入式 Linux系统编程(三)--标准IO库 与文件IO函数相类似,标准IO库中提供的是fopen.fclose.fread.fwrite等面向流对象的IO函数,这些函数在实现时本身就要调用linux的文件IO这些系统调用. 一.标准IO库函数的缓冲机制 由于IO设备的访问速度与CPU的速度相差好几个数量级,为了协调IO设备与CPU的速度的不匹配,对于块设备,内核使用了页高速缓存,即数据会先被拷贝到操作系统内核的页缓存区中,然后才会从操作系统内核的缓存区拷贝到应用程序的地址空间. 当应用程序尝

嵌入式 Linux系统编程(五)——目录文件函数

嵌入式 Linux系统编程(五)--目录文件函数 Linux中目录也是文件,目录操作函数为标准IO库函数.主要函数如下: #include <sys/types.h> #include <dirent.h> DIR *opendir(const char *name); DIR *fdopendir(int fd); 成功返回一个指向目录流的指针,失败返回NULL,并且设置errno全局变量. #include <dirent.h> struct dirent *rea

嵌入式 Linux系统编程(六)——系统信息

嵌入式 Linux系统编程(六)--系统信息 一.时间 Linux系统下常用的时间类型:time_t.struct tm.struct timeval.struct timespec. 1.time_t类型时间 time_t实际是一个长整型.其值表示为从UTC(coordinated universal time)时间1970年1月1日00时00分00秒(也称为Linux系统的Epoch时间)到当前时刻的秒数.由于time_t类型长度的限制,它所表示的时间不能晚于2038年1月19日03时14分

Linux系统编程_3_文件属性

1.Linux中stat结构体包含了一个文件的各种属性. 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  

嵌入式 Linux网络编程(四)——Select机制

嵌入式 Linux网络编程(四)--Select机制 一.select工作机制 poll和select,都是基于内核函数sys_poll实现的,不同在于在linux中select是从BSD Unix系统继承而来,poll则是从SYSTEM V Unix系统继承而来,因此两种方式相差不大.poll函数没有最大文件描述符数量的限制.poll和 select与一样,大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,开销随着文件描述符数量的增加而线性增大. select需要驱动程序的支持,驱动

Linux系统编程之访问文件夹及其文件属性

1. 文件夹操作:opendir, readdir, closedir 2. 文件属性:lstat 3. 实现功能:获取指定文件夹下所有的文件(使用递归),因此就能计算所有文件大小之类的啦... 代码示例如下: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <errno.h> #include <sys/stat

linux系统编程之信号(四)

今天继续探讨信号相关的东东,话不多说,正入正题: 信号在内核中的表示: 下面用图来进一步描述这种信号从产生到递达之间的状态(信号阻塞与未诀): 那是怎么来决定的呢?下面慢慢来举例分解: 所以,通过这些图,可以描述信号从产生到递达的一个过程,上面的理解起来可能有点难,下面会用代码来进一步阐述,在进行实验之前,还需了解一些函数的使用,这些函数在实验中都会被用到,也就是信号集操作函数. 信号集操作函数: 其中解释一下sigset_t,百度百科解释为: 而这个函数的意义就是将这64位清0 这个函数的意义