Các lượt nộp
    Danh sách bài
    Trang chủ
    Báo lỗi

    solution

    Đề bài: [Hệ điều hành Unix] realpath với symlink tương đối

    realpath với symlink trỏ tương đối

    Giống bài realpath nhưng target symlink có thể tương đối. Quy tắc phân giải theo từng thành phần từ gốc giống realpath(3) thật:

    • Duy trì ngăn xếp resolved các thành phần đã phân giải và hàng đợi pending các thành phần còn lại của p.
    • Khi thành phần hiện tại biến resolved + [comp] thành một symlink:
      • target tuyệt đối → đặt lại resolved rỗng rồi nạp các thành phần target vào đầu pending.
      • target tương đối → không thêm comp vào resolved; nạp thẳng các thành phần target (kể cả ..) vào đầu pending. Khi đó .. trong target sẽ lùi trên resolved hiện tại (chính là thư mục chứa symlink).

    Lưu ý: do .. được xử lý trên resolved, một symlink tương đối ../c đặt tại /a/b sẽ cho /c (giống hệ thống thật), chứ không phải /a/c. Giới hạn 40 lần thay thế → ELOOP.

    Ví dụ

    • bảng: /a/b -> ../c; p=/a/b/d → /c/d
    • bảng: /a -> link; p=/a/b → /link/b
    • Định dạng đầu vào:

      Dòng 1: số mục n. n dòng name target. Dòng cuối: p.

    • Ràng buộc đầu vào:

      0 ≤ n ≤ 100. Giới hạn 40.

    • Định dạng đầu ra:

      Một dòng: realpath hoặc ELOOP.

    Ví dụ:

    Đầu vào:

    1
    /a/b ../c
    /a/b/d
    

    Đầu ra:

    /c/d

    Giải thích:

    /a/b là symlink tới ../c; .. lùi trên resolved [a] về rỗng rồi vào c → /c, thêm d → /c/d.

    Đang tải editor...