diff --git a/basic/ch06-file-system.md b/basic/ch06-file-system.md index b6cb1e9..2659953 100644 --- a/basic/ch06-file-system.md +++ b/basic/ch06-file-system.md @@ -9,7 +9,7 @@ 要求: -- 创建 10-file-system 目录 +- 创建 10-file-system 目录 - 编写 01-my-cat-async.js 脚本 - 要求支持命令行参数,包括:要打印的文件名 - 没有命令行参数时,默认打印脚本本身内容 @@ -202,6 +202,9 @@ 要求: - 编写 19-watch.js 脚本 +- 要求支持命令行参数,该参数是要监视的目录名 +- 如果参数不存在,默认监视当前脚本所在的目录 +- 如果参数存在,但是目录不存在,提示错误信息 - 监视脚本所在目录下文件的变化 - 把目录下文件的变化输出到控制台 - 按下 Ctrl+C 或者 kill -2 pid,程序结束运行 @@ -218,3 +221,116 @@ - 命令行参数指定的文件名或者目录名不存在时,打印错误信息 - 如果命令行参数是合法的文件名,则删除文件 - 如果命令行参数是合法的目录名,则删除该目录以及该目录下的所有文件以及子目录 + +## 生成不可压缩的文件 + +要求: + +- 编写 21-bin.js 脚本 +- 该程序在当前目录创建 `test.bin` 文件 +- 该文件有 256 个字节 +- 第一个字节是 0,最后一个字节是 255 +- 每个字节比前一个字节的值递增一 +- 运行该程序 +- `xxd test.bin`,查看每个字节的值 +- 用压缩软件压缩 `test.bin`,看看压缩文件的大小 +- 思考该文件不可压缩的原因 + +## 打印文件加行号 + +要求: +- 编写 22-readline.js 脚本 +- 该程序运行效果类似 `cat -n filename` +- 该程序逐行打印文件内容,并且在每行前面加上行号信息 +- 用 readline 模块实现逐行打印功能 + +## 打印 CPU 信息 + +要求: + +- 编写 23-cpu-info.js 脚本 +- 该程序打印当前操作系统的 CPU 信息 +- CPU 信息类似下面 + +``` +processor : 0 +vendor_id : GenuineIntel +cpu family : 6 +model : 154 +model name : 12th Gen Intel(R) Core(TM) i5-1240P +stepping : 3 +microcode : 0xffffffff +cpu MHz : 2112.008 +下面省略 ...... +``` + +- 思路:`cat /proc/cpuinfo` + +## 打印操作系统的进程信息 + +要求: +- 编写 24-ps.js 脚本 +- 该程序运行的效果类似 `ps aux` +- 该程序能够打印当前操作系统的进程信息 +- 思路:`cat /proc/1/stat; cat /proc/1/cmdline` +- stat 文件中空格隔开的各个字段的含义,请自行查阅资料 + +## 读配置文件 + +要求: +- 编写 25-read-cfg.js 脚本 +- 读取 nodejs-demo 仓库的 package.json 配置文件 +- 在控制台打印 name, version, 和 description 三个信息 +- 参考的输出格式如下: + +``` +name: nodejs-demo +version: 1.0.0 +description: Node.js demo code +``` +## 写日志文件 + +要求: +- 编写 26-web-log.js 脚本 +- 该程序创建 web 服务,监听 8080 端口 +- 收到 HTTP 请求后,向客户端发送 `hello` +- 记录客户端请求的日志 +- 日志文件名格式:`YYYY-MM-DD.log` +- 日志文件名为记录日志的当前日期 +- 即,每天的 HTTP 请求,会记录单独的日志文件 +- 日志文件存放在家目录的 `logs` 文件夹下面 +- 每次请求日志中记录的内容包括两行 +- 第一行,`YYYY/MM/DD hh:mm:ss\t请求方法\请求 URL\HTTP 协议版本` +- 第二行,`YYYY/MM/DD hh:mm:ss\t请求头信息` +- 每次请求的日志信息要追加在日志文件的末尾 +- 用浏览器或 curl 访问 web 服务,查看日志文件是否记录了本次请求 + +## 表格打印 passwd + +要求: +- 编写 27-passwd.js 脚本 +- 以表格的方式打印 `/etc/passwd` 文件 +- `passwd` 文件每行的各个字段由 `:` 分割 +- 每行所包含的字段,从左到右按顺序分别是 + - 用户名(username):用于标识用户的唯一名称。 + - 密码(password):存储用户密码的加密或哈希值。在某些系统中,由于安全原因,通常该字段会被替换为 `x` 或 `*`,实际密码会存储在 /etc/shadow 文件中。 + - 用户ID(user ID):整数值,用于标识用户的唯一ID。一般用户的 UID 范围是1000 到 65534。 + - 组ID(group ID):整数值,用于标识用户所属的主要组的ID。 + - 用户信息(user info):任意文字字段,用于描述用户的详细信息,例如用户的全名、联系方式等。 + - 家目录(home directory):用于存储用户个人文件的目录路径。 + - 登录shell(login shell):用于指定用户登录系统时使用的 shell 程序。 +- 打印的表格中,忽略密码字段和用户信息字段 +- 打印效果参考如下: + +``` +┌─────────┬────────────────────┬───────────┬───────────┬────────────────────────────┬─────────────────────┐ +│ (index) │ user_name │ user_id │ group_id │ home_dir │ login_shell │ +├─────────┼────────────────────┼───────────┼───────────┼────────────────────────────┼─────────────────────┤ +│ 0 │ 'root' │ '0' │ '0' │ '/root' │ '/bin/bash' │ +│ 1 │ 'daemon' │ '1' │ '1' │ '/usr/sbin' │ '/usr/sbin/nologin' │ +│ 2 │ 'bin' │ '2' │ '2' │ '/bin' │ '/usr/sbin/nologin' │ +│ 3 │ 'sys' │ '3' │ '3' │ '/dev' │ '/usr/sbin/nologin' │ +│ 4 │ 'sync' │ '4' │ '65534' │ '/bin' │ '/bin/sync' │ +│ 5 │ 'games' │ '5' │ '60' │ '/usr/games' │ '/usr/sbin/nologin' │ +└─────────┴────────────────────┴───────────┴───────────┴────────────────────────────┴─────────────────────┘ +```