2011-03-07 36 views
11

Nếu tôi đang đọc tệp được lưu trữ trên hệ thống tệp NTFS và tôi cố gắng di chuyển/đổi tên tệp đó trong khi tệp vẫn đang được đọc, tôi bị ngăn không cho làm như vậy. Nếu tôi thử điều này trên một hệ thống tập tin UNIX như EXT3, nó thành công, và quá trình đọc không bị ảnh hưởng. Tôi thậm chí có thể rm các tập tin và đọc các quy trình không bị ảnh hưởng. Cái này hoạt động ra sao? Ai đó có thể giải thích cho tôi lý do tại sao hành vi này được hỗ trợ theo hệ thống tập tin UNIX nhưng không phải NTFS? Tôi có một cảm giác mơ hồ nó phải làm với các liên kết cứng và inodes, nhưng tôi sẽ đánh giá cao một lời giải thích tốt.Làm thế nào để các lệnh UNIX mv và rm hoạt động với các tệp mở?

Trả lời

23

hệ thống tập tin Unix sử dụng tính tham khảo và một kiến ​​trúc hai lớp để tìm các tệp.

Tên tệp đề cập đến tên gọi là inode, cho nút thông tin hoặc nút chỉ mục. Các cửa hàng inode (một con trỏ đến) các nội dung tập tin cũng như một số siêu dữ liệu, chẳng hạn như loại tập tin (bình thường, thư mục, thiết bị, vv) và những người sở hữu nó.

Nhiều tên tệp có thể tham chiếu đến cùng một inode; chúng được gọi là hard links. Ngoài ra, file descriptor (fd) đề cập đến một inode. Một fd là kiểu đối tượng mà một tiến trình nhận được khi nó mở một tệp.

Tệp trong hệ thống tệp Unix chỉ biến mất khi tham chiếu cuối cùng bị mất, vì vậy khi không có thêm tên (liên kết cứng) hoặc tham chiếu của fd. Vì vậy, rm không thực sự xóa tệp; nó xóa một tham chiếu thành một tệp.

Thiết lập hệ thống tệp này có vẻ khó hiểu và đôi khi gây ra sự cố (đặc biệt là với NFS), nhưng có lợi ích là không cần thiết phải khóa cho nhiều ứng dụng. Nhiều chương trình Unix cũng sử dụng tình huống này bằng lợi thế của chúng bằng cách mở một tệp tạm thời và xóa nó ngay sau đó. Ngay sau khi chúng kết thúc, ngay cả khi chúng bị hỏng, tệp tạm thời sẽ biến mất.

+0

Có bất kỳ giới hạn nào đối với nơi tôi có thể di chuyển tệp mở không? Ví dụ. chỉ trong cùng một hệ thống tập tin? –

+0

@ivan_pozdeev thực hiện 'mv' trên một tệp trên các hệ thống tệp khác nhau thực sự sao chép dữ liệu và xóa tệp gốc, trong trường hợp này, nó tương tự như' rm' của tệp đang mở. – dsonck92

4

Trên unix, tên tệp chỉ đơn giản là liên kết đến tệp thực tế (inode). Việc mở tệp cũng tạo liên kết (tạm thời) cho tệp thực. Khi tất cả các liên kết đến một tệp đã biến mất (rm và close()) thì tệp sẽ bị xóa.

Trên NTFS, logic tên tệp tệp. Không có lớp hướng dẫn nào từ tên tệp đến tệp metainfo, chúng là cùng một đối tượng. Nếu bạn mở nó, nó đang được sử dụng và không thể được gỡ bỏ, cũng giống như các tập tin thực tế (inode) trên unix không thể được gỡ bỏ trong khi nó đang được sử dụng.

Unix: Tên tập tin -> FileInfo -> tập tin dữ liệu

NTFS: FileName/FileInfo -> tập tin dữ liệu

Các vấn đề liên quan