本章常用
ls -a 显示隐藏文件
ls -lu 显示最后访问时间
1 编写ls
伪码
opendir: dir_ptr = opendir(dirname)
readdir: direntp = readdir(dir_ptr)
direntp 结构
1
2
3
4
5
6
7
8
#define __DARWIN_STRUCT_DIRENTRY { \
__uint64_t d_ino; /* file number of entry */ \
__uint64_t d_seekoff; /* seek offset (optional, used by servers) */ \
__uint16_t d_reclen; /* length of this record */ \
__uint16_t d_namlen; /* length of string in d_name */ \
__uint8_t d_type; /* file type, see below */ \
char d_name[__DARWIN_MAXPATHLEN]; /* entry name (up to MAXPATHLEN bytes) */ \
}
ls命令,简单版。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void do_ls(char[]);
int main(int ac,char *av[]){
if (ac == 1)
do_ls(".");
else
while (--ac){
printf("%s:\n",*++av);
do_ls(*av);
}
}
void do_ls(char dirname[]){
DIR *dir_ptr;
struct dirent *direntp;
if((dir_ptr = opendir(dirname)) == NULL){
printf("no direct");
} else
{
while ((direntp = readdir(dir_ptr)) != NULL){
printf("%s\n",direntp->d_name);
}
closedir(dir_ptr);
}
}
2 ls -l
2.1 命令初探
1
2
3
4
5
6
7
(base) root@xm-System-Product-Name:/home/xm/xyx/linux_os# ls -l
总用量 28
-rwxr-xr-x 1 root root 8512 1月 4 13:27 a.out
-rw-r--r-- 1 root root 12 1月 4 12:04 a.txt
-rw-r--r-- 1 root root 12 1月 4 12:05 b.txt
-rw-rw-r-- 1 xm xm 563 1月 4 13:29 main.c
drwxr-xr-x 2 root root 4096 1月 4 13:38 xx
-rwxr-xr-x 第一位表示文件or目录,后九位表示权限
连接数
文件所有者
组别
大小
最后修改实践
文件名
2.2 stat 数据结构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
*
* 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 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; //最后一次改变时间(指属性)
};
*/
2.3 st_mode 详解
- st_mode 为16位2进制数,具体如下
前4位为文件类型
中间三为暂略,后文会提到
后9位为权限信息
2.4 掩码技术
为了比较,把不需要的位置置为0,这种技术成为掩码
127.1.1.1 -> 127.0.0.0
2.5 八进制掩码
二进制 100010101 太长了 处理乏味 转为 100,101,101 从而得到八进制数 6,7,7 较为好处理
2.6stat.h
2.7 0170000
0170000可以过滤出前四位表示文件类型
2.8 根据用户id与组id查询用户名与组名
暂略
3. st_mode 的三个特殊位
set_user_id 位 告诉内核 运行改文件的时候认为是文件的所有者在运行改文件
set_group_id 位 运行该文件时,好像被组中某一用户运行
sticky 位 sticky 告诉内核,即使没有人使用该程序,可要把它放在交换空间。