Lesson 22 — File & OS
3 module tương tác minh hoạ 3 chủ đề trọng tâm của lesson: (1) Permission Unix dạng octal — click rwx, xem cách 9 bit gói thành 3 digit; (2) filepath.Walk — animate DFS qua một cây thư mục, biết Skip vào dir; (3) Atomic write — so sánh trực tiếp pattern an toàn (write tmp + rename) với pattern non-atomic, demo điều gì xảy ra khi process bị kill giữa lúc đang ghi.
1. Permission grid — octal là gì?
Click vào từng ô r / w / x để toggle. 3 hàng tương ứng owner / group / other.
Mỗi hàng có 3 bit → tạo 1 digit octal (0–7). 3 digit gộp lại = perm dạng 0644, 0755...
Lệnh chmod ở dưới luôn được sync với trạng thái grid.
0000 = không ai làm gì được).
2. filepath.Walk — DFS qua cây thư mục
Walk mặc định là DFS pre-order: visit node hiện tại trước, rồi đi sâu vào children
bên trái. Khi callback trả filepath.SkipDir → nhánh đó bị bỏ qua. Ấn ▶ để chạy step-by-step.
SkipDir: trả filepath.SkipDir từ callback khi
visit một dir → Walk bỏ qua toàn bộ subtree dưới dir đó. Ứng dụng thực tế: skip
vendor/, node_modules/, .git/ trong project lớn — tiết kiệm
hàng nghìn syscall.
3. Atomic write vs Non-atomic — điều gì khi crash?
Hai cột song song mô phỏng việc cập nhật config.json. Cột trái dùng pattern atomic
(write tmp → fsync → rename). Cột phải ghi trực tiếp đè lên file. Ấn ▶ chạy. Ấn Kill mid-write
để mô phỏng crash giữa lúc đang ghi — quan sát cột nào còn data nguyên vẹn.
✓ Atomic (tmp + rename)
✗ Non-atomic (write thẳng)
rename) — kernel đảm bảo người đọc thấy hoặc file cũ, hoặc
file mới, không có trạng thái giữa.
/tmp (tmpfs) còn target ở /var/data (ext4 mount riêng),
os.Rename sẽ rơi vào fallback copy+delete — KHÔNG còn atomic. Pattern đúng:
os.CreateTemp(filepath.Dir(target), "...").