Có tên đường dẫn POSIX không thể đặt tên tệp?


4

Có bất kỳ đường dẫn pháp lý nào trong POSIX không thể được liên kết với một tệp, thường xuyên hoặc không thường xuyên không? Đó là, mà test -e "$LEGITIMATEPOSIXPATHNAME"không thể thành công?

Làm rõ # 1: tên đường dẫn

Theo "đường dẫn hợp pháp trong POSIX", ý tôi là những đường dẫn mà POSIX nói được cho phép, không phải những đường dẫn mà POSIX không cấm rõ ràng. Tôi đã xem xét điều này và đặc tả POSIX gọi chúng là các chuỗi ký tự:

  1. Chỉ sử dụng các ký tự từ bộ ký tự tên tệp di động [a-zA-Z0-9._-](xem http://www.opengroup.org/onlinepub/009695399/basingefs/xbd_chap03.html#tag_03_276 );
  2. Đừng bắt đầu với -; và
  3. Có độ dài từ 1 đến NAME_MAX, một số chưa được chỉ định cho POSIX không nhỏ hơn 14.

POSIX cũng cho phép các hệ thống tập tin có thể sẽ thoải mái hơn thế này, nhưng nó cấm các ký tự NUL và /xuất hiện trong tên tệp. Lưu ý rằng tên tệp UNIX theo mô hình như lost+foundvậy không phải là FPF, theo def này. Có một PATH_MAX không đổi khác, người sử dụng không cần giải thích thêm.

Câu trả lời lý tưởng sẽ sử dụng các FPF, nhưng tôi quan tâm đến bất kỳ ví dụ nào với tên tệp mà POSIX không cấm hoàn toàn.

Làm rõ # 2: không thể

Rõ ràng, tên đường dẫn thông thường có thể được liên kết vào một tệp. Nhưng ngữ nghĩa UNIX sẽ cho bạn biết rằng có những nơi đặc biệt thường không thể có các tệp tùy ý được tạo, như trong /devthư mục. Có nơi nào đặc biệt như vậy được quy định trong POSIX không? Đó là những gì câu hỏi nhận được sau.


4
Hmmm, tôi đã tự hỏi nếu tiêu đề đó không thể mô tả nhiều hơn, nhưng bất cứ điều gì tôi nghĩ ra dường như mang lại mâu thuẫn trong điều khoản ...
Arjan

Chỉ là một ghi chú ... không phải là \ nó /. Trong Unix \ là một ký tự tốt có trong một tệp. / user / chuck / tom \ mary tên tệp = tom \ mary.
DrFloyd5

@DrFloyd: Phải. Đã sửa.
Charles Stewart

1
Tôi thích câu hỏi này. Nó làm tôi nhớ đến "Der Mouse", khi chuyển từ VMS sang UNIX, cảm thấy khó chịu vì anh ta không thể tìm ra cách tạo tên tệp bằng dấu gạch chéo hoặc null trong đó - trong đó dấu gạch chéo là một phần của tên tệp trong thư mục, chứ không phải là một dấu phân cách giữa thư mục và một cái gì đó trong thư mục. // API POSIX tiêu chuẩn không tạo ra lỗi trên tên tệp như vậy, chúng chỉ đơn giản diễn giải các ký tự đặc biệt được nhúng dưới dạng đường dẫn riêng biệt hoặc kết thúc chuỗi.
Krazy Glew

Câu trả lời:


3

Vì câu hỏi cuối cùng là liệu có những nơi đặc biệt thường không có tệp hay không, như trong thư mục / dev được quy định trong POSIX, nên andswer là .

Danh sách đầy đủ các tệp và thư mục được xác định trước được đưa ra trong chương 10, Cấu trúc và thiết bị thư mục POSIX , của Thông số kỹ thuật cơ sở nhóm mở của IEEE Vấn đề 6 :

Các thư mục sau sẽ tồn tại trên các hệ thống tuân thủ và các ứng dụng tuân thủ sẽ chỉ sử dụng chúng như mô tả. Các ứng dụng tuân thủ nghiêm ngặt sẽ không đảm nhận khả năng tạo tệp trong bất kỳ thư mục nào, trừ khi được chỉ định dưới đây.

/
Thư mục gốc.
/ dev
Chứa / dev / console, / dev / null và / dev / tty, được mô tả bên dưới.

Thư mục sau sẽ tồn tại trên các hệ thống phù hợp và sẽ được sử dụng như mô tả:

/ tmp
Một thư mục được tạo sẵn cho các ứng dụng cần một nơi để tạo các tệp tạm thời. Các ứng dụng sẽ được phép tạo các tệp trong thư mục này, nhưng không cho rằng các tệp đó được bảo tồn giữa các yêu cầu của ứng dụng.

Các tệp sau phải tồn tại trên các hệ thống phù hợp và phải có thể đọc và ghi được:

/ dev / null
Một nguồn dữ liệu vô hạn và dữ liệu chìm. Dữ liệu được ghi vào / dev / null sẽ bị loại bỏ. Đọc từ / dev / null sẽ luôn trả về cuối tập tin (EOF).
/ dev / tty
Trong mỗi quy trình, một từ đồng nghĩa cho thiết bị đầu cuối kiểm soát được liên kết với nhóm quy trình của quy trình đó, nếu có. Nó rất hữu ích cho các chương trình hoặc thủ tục shell muốn chắc chắn viết tin nhắn đến hoặc đọc dữ liệu từ thiết bị đầu cuối cho dù đầu ra đã được chuyển hướng như thế nào. Nó cũng có thể được sử dụng cho các ứng dụng yêu cầu tên của tệp cho đầu ra, khi muốn nhập đầu ra và rất mệt mỏi để tìm ra thiết bị đầu cuối nào đang được sử dụng.

Các tập tin sau sẽ tồn tại trên các hệ thống phù hợp và không cần phải đọc hoặc ghi được:

/ dev / console
Tệp / dev / console là tên chung được đặt cho bảng điều khiển hệ thống (xem Bảng điều khiển hệ thống). Nó thường được liên kết với một tập tin đặc biệt được xác định thực hiện. Nó sẽ cung cấp một giao diện cho bảng điều khiển hệ thống phù hợp với các yêu cầu của âm lượng Định nghĩa cơ sở của IEEE Std 1003.1-2001, Chương 11, Giao diện thiết bị đầu cuối chung.


Tôi giả sử rằng thuật ngữ "tập tin" cũng bao gồm các thư mục, vì vậy trong ví dụ của bạn, chương trình POSIX cũng không thể cho rằng nó có thể tạo một thư mục có tên "không thể". Thuật ngữ được sử dụng là một chút khó hiểu và tôi cho rằng các tác giả đã không tưởng tượng rằng / dev có thể chứa các thư mục.
harrymc

/devcó thể và thường không chứa các thư mục: SunOS đã có một fsfs được gắn ở /dev/fdmọi lứa tuổi và được sao chép bởi hầu hết các UNIX hiện đại. Nhưng POSIX cấm một tập tin vừa là một ký tự đặc biệt vừa là một thư mục, vì vậy không thể có bất cứ điều gì bên dưới /dev/tty. Vì vậy, chọn: Tôi có câu trả lời của tôi.
Charles Stewart

3

Việc kiểm tra tên tệp có ký tự null trong đó sẽ luôn thất bại.

POSIX dự trữ '/' và null từ tên tệp. Điều này là hợp lý: một là dấu phân cách thư mục và một là dấu kết thúc chuỗi. Để hỗ trợ điểm đó, Wikipedia cho biết ext2, ext3 và ext4 cho phép tất cả các byte trong tên tệp ngoại trừ null và dấu gạch chéo về phía trước. NTFS, có hoặc không ở chế độ tương thích POSIX, không cho phép nhiều hơn thế; và các biến thể FAT cũng không cho phép null. Về lý thuyết, nó thực sự phụ thuộc vào hệ thống tập tin. Nhưng tôi sẽ không nín thở khi cố gắng tìm một trường hợp mà null tìm được tên tập tin.


+1 cho một câu trả lời khiến tôi tìm kiếm một cái gì đó. POSIX cấm "/" và NUL trong tên tệp. Cf. câu hỏi của tôi postcript.
Charles Stewart

2

/dev/null/impossiblekhông thể tồn tại Điều này là do /dev/nullphải là một tệp và vì vậy không thể là một thư mục.

Tương tự cho /dev/tty/impossible/dev/console/impossible


1

"Đường dẫn pháp lý trong POSIX" đã có nghĩa là nó có thể trỏ đến một đối tượng hệ thống tệp (tệp, thư mục, symlink, v.v.).

Về ý nghĩ thứ hai, một số hệ thống tập tin (như FAT) có các hạn chế đối với các ký tự được phép trong tên tệp. Vì vậy, trong máy tính của tôi, ~/fs/phone/This:is*a?file|name.txtsẽ bị vfattrình điều khiển hệ thống tập tin từ chối .


Để trả lời câu hỏi thứ hai, test -e "$LEGITIMATEPOSIXPATHNAME"thất bại khi tập tin không tồn tại, rõ ràng.


Hehe, +1 cho đoạn cuối đó. Có một câu trả lời cho bất kỳ câu hỏi, tôi đoán. :-)
Arjan

s / fail / không thể thành công /
Charles Stewart

1
Tôi không quen thuộc với bất kỳ * nix nào /dev/fd/this-is-not-a-filecó thể là một tệp, nhưng IIUC, POSIX không nói rằng đó không thể là một tệp. Vì vậy, đường dẫn hợp pháp trong POSIX không có nghĩa là HĐH tuân thủ POSIX phải cho phép tạo tệp ở đó.
Charles Stewart

-1: Hoàn toàn bỏ lỡ điểm của câu hỏi.
Charles Stewart

@Charles, nó gây ấn tượng với tôi là kỳ quặc khi bạn hạ thấp trong khi tôi nghĩ rằng câu hỏi của bạn không rõ ràng để bắt đầu. (Và vẫn có một tiêu đề rất tệ, đó hoàn toàn không phải là một câu hỏi - superuser.com/faq )
Arjan

0

Thử nghiệm sẽ thất bại nếu tên tệp phá vỡ các giới hạn của việc triển khai POSIX cục bộ.

Mỗi hệ thống tệp tồn tại đều đưa ra các giả định về độ dài tối đa, giới hạn đệ quy thư mục và hơn thế nữa. Vì vậy, tên POSIX hợp pháp trên một hệ điều hành có thể không hợp pháp trên một hệ điều hành khác.

Vì vậy, câu trả lời của tôi cho câu hỏi là "Có":
Ngay cả các tên hợp pháp khi được thử nghiệm trên một hệ thống POSIX, có thể bị từ chối bởi một hệ thống khác, vì các hạn chế triển khai.


Theo định nghĩa, mọi tên đường dẫn mà POSIX nói là hợp pháp đều được chấp nhận trên tất cả các hệ thống tệp tuân thủ POSIX. Đó là những điều mà tôi quan tâm.
Charles Stewart

Chà, NAME_MAX và PATH_MAX phụ thuộc vào việc triển khai. Tôi nghĩ rằng bạn đang mâu thuẫn với chính mình khi bạn hỏi (1) về tên tệp POSIX không thể đạt được, đồng thời (2) được chấp nhận trên tất cả các hệ thống tuân thủ POSIX. Theo định nghĩa, tên tệp có thể chấp nhận không thể không đạt được và mẫu số chung ít nhất của tất cả các hệ thống POSIX luôn có thể đạt được trên tất cả chúng.
harrymc

Aha! Không, tôi muốn tên đường dẫn sẽ hoạt động, ngoại trừ các giả định khác trong POSIX ngăn các tệp tồn tại
Charles Stewart
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.