Skip to content

Commit

Permalink
docs: add file system task
Browse files Browse the repository at this point in the history
  • Loading branch information
wangding committed Oct 13, 2023
1 parent c64f182 commit 7d9c855
Showing 1 changed file with 117 additions and 1 deletion.
118 changes: 117 additions & 1 deletion basic/ch06-file-system.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

要求:

- 创建 10-file-system 目录
- 创建 10-file-system 目录
- 编写 01-my-cat-async.js 脚本
- 要求支持命令行参数,包括:要打印的文件名
- 没有命令行参数时,默认打印脚本本身内容
Expand Down Expand Up @@ -202,6 +202,9 @@
要求:

- 编写 19-watch.js 脚本
- 要求支持命令行参数,该参数是要监视的目录名
- 如果参数不存在,默认监视当前脚本所在的目录
- 如果参数存在,但是目录不存在,提示错误信息
- 监视脚本所在目录下文件的变化
- 把目录下文件的变化输出到控制台
- 按下 Ctrl+C 或者 kill -2 pid,程序结束运行
Expand All @@ -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' │
└─────────┴────────────────────┴───────────┴───────────┴────────────────────────────┴─────────────────────┘
```

0 comments on commit 7d9c855

Please sign in to comment.