Posts 重写linux命令03_ls
Post
Cancel

重写linux命令03_ls

本章常用

  • ls -a 显示隐藏文件

  • ls -lu 显示最后访问时间

1 编写ls

伪码

  1. opendir: dir_ptr = opendir(dirname)

  2. readdir: direntp = readdir(dir_ptr)

  3. 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
  1. -rwxr-xr-x 第一位表示文件or目录,后九位表示权限

  2. 连接数

  3. 文件所有者

  4. 组别

  5. 大小

  6. 最后修改实践

  7. 文件名

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 详解

  1. st_mode 为16位2进制数,具体如下

p1

  1. 前4位为文件类型

  2. 中间三为暂略,后文会提到

  3. 后9位为权限信息

2.4 掩码技术

为了比较,把不需要的位置置为0,这种技术成为掩码

127.1.1.1 -> 127.0.0.0

2.5 八进制掩码

二进制 100010101 太长了 处理乏味 转为 100,101,101 从而得到八进制数 6,7,7 较为好处理

2.6stat.h

p1

2.7 0170000

0170000可以过滤出前四位表示文件类型

2.8 根据用户id与组id查询用户名与组名

暂略

3. st_mode 的三个特殊位

  1. set_user_id 位 告诉内核 运行改文件的时候认为是文件的所有者在运行改文件

  2. set_group_id 位 运行该文件时,好像被组中某一用户运行

  3. sticky 位 sticky 告诉内核,即使没有人使用该程序,可要把它放在交换空间。

This post is licensed under CC BY 4.0 by the author.

Contents

Trending Tags