ls - list directory contents (man ls)
ls的功能是列出目录中的内容。那目录中都有写什么内容呢?我们知道磁盘上的文件系统由文件和目录组成,文件的内容可以是任意的数据,而目录的内容只能是文件名的列表和子目录名的列表。
也就是说:目录中的内容是该目录下的文件和子目录它们的名字的列表。
我们先来看一看关于目录的结构体:(/usr/include/bits/dirent.h)
- struct dirent {
-
ino_t d_ino; /* inode number */
-
off_t d_off; /* offset to the next dirent */
-
unsigned short d_reclen; /* length of this record */
-
unsigned char d_type; /* type of file; not supportedby all file system types */
-
char d_name[256]; /* filename */
-
};
d_ino是目录中的文件的i-node节点号,通过d_ino可以找到该文件的i-node节点,而i-node节点中保存了文件的属性等信息。通过i-node节点就可以访问到文件的内容。
关于目录访问的一些函数:(/usr/include/dirent.h)
- #include <sys/types.h>
-
#include <dirent.h>
-
-
DIR *opendir(const char *name);
-
DIR *fdopendir(int fd);
-
struct dirent *readdir(DIR *dirp);
-
int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);
-
int closedir(DIR *dirp);
-
void rewinddir(DIR *dirp);
关于目录中文件的属性等信息使用struct stat结构体来描述的,其结构的定义如下: (/usr/include/bits/stat.h)
- struct stat
- {
-
__dev_t st_dev; /* Device. */
-
unsigned short int __pad1; /* 用于填充对齐 */
-
__ino_t st_ino; /* 32bit file serial number. */
-
__mode_t st_mode; /* File mode. */
-
__nlink_t st_nlink; /* Link count. */
-
__uid_t st_uid; /* User ID of the file's owner. */
-
__gid_t st_gid; /* Group ID of the file's group.*/
-
__dev_t st_rdev; /* Device number, if device. */
-
unsigned short int __pad2; /* 用于填充对齐 */
-
__off_t st_size; /* Size of file, in bytes. */
-
__blksize_t st_blksize; /* Optimal block size for I/O. */
-
__blkcnt_t st_blocks; /* Number 512-byte blocks allocated. */
-
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
-
__ino64_t st_ino; /* File serial number. */
- };
该结构体提供了关于文件(或者设备)的如下重要信息:
st_mode 文件类型和许可权限
st_nlink 文件链接数
st_uid 文件属主id
st_gid 文件属主所在组的id
st_size 文件的字节数
st_blocks 文件所占的块数
“ACM”三个时间:
st_atime 文件最后访问时间 (access time)
st_mtime 文件最后修改时间 (modification time)
st_ctime 文件属性/状态最后改变的时间 (change status time)
另外在/usr/include/sys/stat.h中提供了下列关于文件信息的宏定义:
- typedef __dev_t dev_t;
-
typedef __gid_t gid_t;
-
typedef __ino_t ino_t;
-
typedef __mode_t mode_t;
-
typedef __nlink_t nlink_t;
-
typedef __off_t off_t;
-
typedef __uid_t uid_t;
-
typedef __blkcnt_t blkcnt_t;
-
typedef __blksize_t blksize_t;
-
-
/* Test macros for file types. */
-
#define __S_ISTYPE(mode, mask) (((mode) & __S_IFMT) == (mask))
-
-
#define S_ISDIR(mode) __S_ISTYPE((mode), __S_IFDIR) // directory 目录文件类型
-
#define S_ISCHR(mode) __S_ISTYPE((mode), __S_IFCHR) // char 字文件类型
-
#define S_ISBLK(mode) __S_ISTYPE((mode), __S_IFBLK) // block 块文件类型
-
#define S_ISREG(mode) __S_ISTYPE((mode), __S_IFREG) // regular 普通文件类型
-
#define S_ISFIFO(mode) __S_ISTYPE((mode), __S_IFIFO) // FIFO 管道文件类型
-
#define S_ISLNK(mode) __S_ISTYPE((mode), __S_IFLNK) // link 链接文件类型
-
#define S_ISSOCK(mode) __S_ISTYPE((mode), __S_IFSOCK) // sock 网络套接字文件类型
-
-
/* Protection bits. */
-
-
#define S_ISUID __S_ISUID /* Set user ID on execution. */
-
#define S_ISGID __S_ISGID /* Set group ID on execution. */
-
-
#define S_IRUSR __S_IREAD /* Read by owner. */
-
#define S_IWUSR __S_IWRITE /* Write by owner. */
-
#define S_IXUSR __S_IEXEC /* Execute by owner. */
-
/* Read, write, and execute by owner. */
-
#define S_IRWXU (__S_IREAD|__S_IWRITE|__S_IEXEC)
-
-
#define S_IRGRP (S_IRUSR >> 3) /* Read by group. */
-
#define S_IWGRP (S_IWUSR >> 3) /* Write by group. */
-
#define S_IXGRP (S_IXUSR >> 3) /* Execute by group. */
-
/* Read, write, and execute by group. */
-
#define S_IRWXG (S_IRWXU >> 3)
-
-
#define S_IROTH (S_IRGRP >> 3) /* Read by others. */
-
#define S_IWOTH (S_IWGRP >> 3) /* Write by others. */
-
#define S_IXOTH (S_IXGRP >> 3) /* Execute by others. */
-
/* Read, write, and execute by others. */
-
#define S_IRWXO (S_IRWXG >> 3)
-
-
# define S_BLKSIZE 512 /* Block size for `st_blocks'. */
阅读(1488) | 评论(0) | 转发(1) |