Thử thách Kernighan và Pike: làm thế nào để đặt dấu gạch chéo trong tên tệp?


23

Tôi vừa gặp câu hỏi sau đây trong Môi trường lập trình Unix , cuốn sách kinh điển của Kernighan và Pike về Unix (Tôi tìm thấy văn bản dưới đây trên trang 79 của năm 1984, ISBN: 0-13-937699-2):

Bài tập 3-6. (Câu hỏi lừa) Làm thế nào để bạn có được một / thành một tên tệp (nghĩa là a / không tách các thành phần của đường dẫn?

Tôi đã làm việc với Linux trong nhiều năm, với tư cách là người dùng cuối và lập trình viên, nhưng tôi không thể trả lời câu hỏi này. Không có cách nào để đặt dấu gạch chéo trong tên tệp, điều này hoàn toàn bị cấm bởi kernel. Bạn có thể vá hệ thống tệp của mình thông qua truy cập thiết bị khối hoặc sử dụng các ký tự trông tương tự từ Unicode, nhưng đó không phải là giải pháp.

Tôi hiểu rằng Linux ≠ Unix, nhưng nguyên tắc tương tự nên được áp dụng, vì hệ thống phải có khả năng trích xuất rõ ràng hệ thống phân cấp thư mục từ các đường dẫn.

Có ai biết, chính xác thì Kernighan và Pike nghĩ gì khi hỏi câu hỏi này? Câu trả lời được cho là gì? Chính xác thì 'mánh' là gì? Hoặc có thể hệ thống Unix ban đầu chỉ đơn giản là được phép thoát khỏi dấu gạch chéo này bằng cách nào đó?

CẬP NHẬT:

Tôi đã liên lạc với Brian Kernighan về câu hỏi và đó là những gì anh ấy trả lời:

Câu trả lời là (hoặc là) Bạn không thể.

Do đó, Timothy Martin đã đúng và được đánh dấu màu xanh lá cây.



1
Một thông tin khác có liên quan unix.stackexchange.com/questions/328928/iêu
Philip Kirkbride

Hừm. Có lẽ bạn có thể tạo một tệp chứa chữ thường avà ép buộc hệ thống của bạn nghĩ rằng hệ thống tệp nằm trong miền địa phương EBCDIC? ASCII alà 0x61, tương ứng với /EBCDIC (mã trang 37)
Fox

Có phải cuốn sách nói rằng đó là một câu hỏi mẹo? Nếu vậy, tôi nghĩ rằng khá nhiều xác nhận rằng bạn sẽ không thể tìm ra cách thiết kế phụ để thực hiện nó, để lại những ý tưởng vượt trội mà bạn đã nêu.
ilkkachu

Câu trả lời:


12

Có lẽ câu trả lời giống như một phần của câu trả lời trong câu hỏi mẹo này:
Làm thế nào để bạn xuống khỏi một con voi? Bạn không. Bạn nhận được nó từ một con ngỗng.

Từ "Thực hành lập trình" của Brian W. Kernighan và Rob Pike, Ch. 6, pg. 158:

Khi Steve Bourne đang viết shell Unix (được gọi là shell Bourne), anh ta đã tạo một thư mục gồm 254 tệp có tên một ký tự, một cho mỗi giá trị byte ngoại trừ '\ 0' và gạch chéo, hai ký tự đó không thể xuất hiện trong tên tệp Unix.


3
Cảm ơn bạn đã dạy tôi trò đùa đó. Nó có thể, có thể, phục vụ như một bài kiểm tra lưu loát tiếng Anh (điều mà tôi vừa thất bại).
firegurafiku

Bạn đa đung. Xem CẬP NHẬT.
firegurafiku

1
@firegurafiku giải thích trò đùa .
Isaac

5

Tôi đã làm điều này. Đây là trên một hệ thống UNIX chạy trên PDP-11 vào khoảng năm 1980. Tôi đã tạo một tệp có tên "WhatXNow?". Sau đó, tôi đã sử dụng một "trình chỉnh sửa" tệp nhị phân để chỉnh sửa thiết bị đĩa và thay đổi "X" thành "/" trong nút (với hệ thống tệp không được đếm).

Nạn nhân không bao giờ tìm ra cách để loại bỏ nó.

Chỉnh sửa: Rất tiếc, Barmar đã đúng, tôi không thấy dòng trong đó về việc không vá thiết bị. Và vâng, đó là thư mục tôi đã chỉnh sửa, không phải là inode. Đã được một lúc :-)


1
Tên tệp không có trong nút, chúng nằm trong tệp đặc biệt của thư mục.
Barmar

1
Tôi nghi ngờ fscksẽ loại bỏ nó.
Barmar

1
Câu hỏi cho biết Bạn có thể vá hệ thống tệp của mình thông qua truy cập thiết bị chặn hoặc sử dụng các ký tự trông tương tự từ Unicode, nhưng đó không phải là giải pháp. Đó không phải là những gì bạn mô tả trong câu trả lời của bạn?
Barmar

@Barmar: Hmm, có lẽ tôi đang xem xét lại câu hỏi và vá hệ thống tập tin là giải pháp có nghĩa là gì? Tôi không biết.
firegurafiku

Tôi cá rằng đây là câu trả lời. Tôi nhớ khi bạn có thể đọc các thư mục. Có lẽ từ lâu gốc có thể viết chúng.
Joshua

1

Bất kỳ kịch bản nào /(chính xác hơn là byte byte không phải là ký tự có giá trị 0x2f; gần như tất cả các hạt nhân Unix đều cố tình quên mã hóa ký tự) tìm đường vào một mục nhập thư mục, mà không có khối đĩa thô nào bị thao tác bằng tay, không nghi ngờ gì nữa. một lỗi trong kernel.

Lỗi như vậy xảy ra theo thời gian. Một trường hợp tôi nhớ là đã đọc các ghi chú về bản vá, đó là một số lần lặp lại từ những năm 1990 của tôi muốn nói Solaris, nhưng điều đó có thể sai đã cung cấp một máy chủ cho Giao thức lưu trữ AppleTalk (AFP), tương đương với NFS cổ điển của MacOS . Vấn đề là, trên MacOS cổ điển, bạn hoàn toàn được phép đặt /một thành phần tên đường dẫn; :thay vào đó là dấu phân cách thư mục . Máy chủ AFP được cho là thực hiện tương đương đạo đức tr :/ /:khi ánh xạ tên đường dẫn được gửi bởi khách hàng vào các tệp trên đĩa của nó, nhưng họ đã bỏ lỡ một vài đường dẫn mã và vì máy chủ được triển khai bên trong kernel, nên nó thực sự có thể ghi ra các mục thư mục xấu.

(Xem phần Câu hỏi thường gặp của comp.unix # 2.2 , phần bắt đầu "Nếu tên tệp có '/' trong đó thì sao?", Cho phiên bản dài hơn ở trên.)

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.