Tại sao là tất cả mọi thứ là một tập tin duy nhất của hệ điều hành Unix?


70

Tôi thường nghe mọi người nói "triết lý độc đáo của Unix là nó coi mọi thứ là một tệp" hoặc "Trong Unix, mọi thứ đều là một tệp". Nhưng tôi chưa bao giờ nghe ai giải thích tại sao nó là duy nhất đối với Unix.

Vì vậy, tại sao điều này là duy nhất cho Unix? Có các hệ điều hành khác như Windows và Mac không hoạt động trên các tệp?

Và, nó là duy nhất so với các hệ điều hành khác?


26
sidenote: macosx chạy ontop của một unix.
akira

2
fwiw, trong khi các công cụ cấp cao hơn không sử dụng các tệp (giống như dbus hoặc X trong * nix), Windows cấp thấp được xây dựng xung quanh các thẻ điều khiển. Bạn có thể làm rất nhiều thứ tương tự với chúng vì bạn có thể tập tin trên * nix (mở, đóng, kiểm soát và thường gửi / nhận), nhưng bạn cần phải là lập trình viên để xem giao diện đó. Cho dù đó là một điều tốt là một vấn đề ưu tiên.
Đánh dấu

1
tất cả mọi thứ là một tập tin, ngoại trừ giao diện mạng.
alvin

8
@akira - OSX được chứng nhận Unix và không chạy "trên đầu trang".
Cướp

1
@akira Không phải trên Unix. OSX là một trong số ít HĐH UNIX được chứng nhận.
Let_Me_Be

Câu trả lời:


53

Vì vậy, tại sao điều này là duy nhất cho Unix?

Các hệ điều hành điển hình, trước Unix, đã xử lý các tệp một cách và xử lý từng thiết bị ngoại vi theo các đặc điểm của thiết bị đó. Đó là, nếu đầu ra của một chương trình được ghi vào một tệp trên đĩa, đó là nơi duy nhất mà đầu ra có thể đi; bạn không thể gửi nó đến máy in hoặc ổ đĩa băng. Mỗi chương trình phải nhận thức được từng thiết bị được sử dụng cho đầu vào và đầu ra và có các tùy chọn lệnh để xử lý các thiết bị I / O thay thế.

Unix coi tất cả các thiết bị là tập tin, nhưng với các thuộc tính đặc biệt. Để đơn giản hóa các chương trình, đầu vào tiêu chuẩnđầu ra tiêu chuẩn là các thiết bị đầu vào và đầu ra mặc định của một chương trình. Vì vậy, đầu ra chương trình thường dành cho màn hình giao diện điều khiển có thể đi bất cứ nơi nào, đến tệp đĩa hoặc máy in hoặc cổng nối tiếp. Đây được gọi là I / O chuyển hướng .

Có các hệ điều hành khác như Windows và Mac không hoạt động trên các tệp?

Tất nhiên tất cả các hệ điều hành hiện đại đều hỗ trợ các hệ thống tệp khác nhau và có thể "hoạt động trên các tệp", nhưng điểm khác biệt là các thiết bị được xử lý như thế nào? Không biết về Mac, nhưng Windows cung cấp một số chuyển hướng I / O.

Và, so với những gì hệ điều hành khác là nó độc đáo?

Không thực sự nữa. Linux có tính năng tương tự. Tất nhiên, nếu một hệ điều hành chấp nhận chuyển hướng I / O, thì cuối cùng nó có xu hướng sử dụng các tính năng Unix khác và kết thúc giống như Unix.


29
OS X về cơ bản là Unix, vì vậy không có nhiều sự khác biệt.
slhck

6
thêm một chút cho tất cả mọi thứ một mô hình tập tin.
artistoex

1
Đoạn mở đầu đơn giản là không đúng. Có các hệ điều hành trước Unix và chúng có các tính năng sau này được tìm thấy trong Unix, bao gồm cả chuyển hướng I / O.
Patrick Seymour

3
Kế hoạch 9 có cùng một khái niệm Mọi thứ đều là một khái niệm tệp và thậm chí còn được gọi là "thêm unix rồi unix"
William

2
Windows (kể từ NT) đi xa hơn một chút. Có rất nhiều thiết bị hoạt động giống như các tệp, chẳng hạn như cổng nối tiếp và đường ống được đặt tên. Bạn có thể viết cho tất cả bằng cách sử dụng WriteFile. Nhưng ngoài ra, còn có một loại "đối tượng đồng bộ hóa" lớn hơn bao gồm không chỉ các tệp mà còn cả các biến thể.
MSalters

34

Ý tưởng rằng "mọi thứ là một tập tin" xuất phát từ Multics. Các nhà thiết kế của Unix dựa rất nhiều công việc của họ vào các phiên bản tiền nhiệm, đặc biệt là Multics. Thật vậy, rất nhiều thứ trong điện toán dựa trên những người tiền nhiệm.

Bạn có thể đọc thêm về công việc của Dennis Ritchie trong thiết kế Unix để biết thêm. Ông đã tham khảo những thứ mà họ "sao chép" từ Multics, chẳng hạn như hệ thống tệp giống như cây, vỏ lệnh và không cấu trúc các tệp. Tôi không ngụ ý rằng những người Unix đã đánh cắp từ những người Multics. Đối với tất cả ý định và mục đích, đó là cùng một người.


6
Đây không phải là câu trả lời được bình chọn cao nhất, nó không trả lời câu hỏi, nó chỉ cầu xin mọi người hỏi một câu hỏi khác: "Tại sao 'Mọi thứ là một tệp' trong Multics?"
Lie Ryan

13
@LieRyan: Thật ra nó trả lời câu hỏi tại sao nó độc đáo : không phải vậy.
Goran Jovic

1
Những người Unix chỉ lấy ý tưởng của họ với họ khi dự án Multics bị ngừng và đổi tên nó. Unix chỉ là một cách chơi chữ - một VS nhiều.
Phòng thí nghiệm Fiasco

2
@Lie Ryan - Câu hỏi không phải là tại sao mọi thứ là một tập tin, đó là lý do tại sao nó là duy nhất. Như Goran và tôi đã chỉ ra, không phải vậy.
Patrick Seymour

1
Câu hỏi thực sự đề cập đến "hệ điều hành Unix s ", tức là gia đình. Gia đình đó hợp lý bao gồm Multics và Linux.
MSalters

28

Độc nhất? Số xác định? Chắc chắn rồi.

Có mọi thứ dưới dạng tệp hoặc thiết bị trong hệ thống phân cấp đã biết có nghĩa là bạn có thể sử dụng cùng một bộ công cụ cho mọi thứ. Kế hoạch 9 từ Bell Labs thực hiện điều này hơn nữa với ngay cả các thiết bị phần cứng dưới dạng tệp.

Quan trọng hơn, điều này cho phép hai khái niệm rất đơn giản và mạnh mẽ. Các tiện ích cơ bản làm One Thing Well (tm), có thể được xâu chuỗi cùng với các đường ống khi cần thiết. Bạn muốn tìm một cái gì đó trong một tập tin văn bản? Sử dụng catđể hiển thị nó, vượt qua nó grepvà bạn đang nấu ăn bằng gas. Đó là sức mạnh thực sự của cách 'Unix' - các ứng dụng chuyên biệt hoạt động cùng nhau để có được sự linh hoạt lớn.

Mac OS X cũng tuân theo triết lý Unix, nhưng nó ẩn tốt hơn (gói 'ứng dụng' thực sự là một thư mục chứa đầy các tệp) và trên thực tế là một Unix được chứng nhận phù hợp, có nguồn gốc từ NeXT , sử dụng các bit FreeBSD .

Với Windows, có một số thành phần nhị phân như trình xem sự kiện và đăng ký kể từ đó, và có một số lợi thế về tốc độ ở đó, trong kịch bản cụ thể đó.


1
Cộng 1 để đề cập đến kế hoạch 9. FHO Fuse mang kế hoạch 9 gần hơn với việc triển khai thông qua quảng cáo và lặp lại.
Daniel Staple

2
Chà, kế hoạch 9 là kế hoạch 9, nó sắp xếp rồi. Fuse chỉ cho phép mở rộng hệ thống tập tin người dùng theo .. cách thú vị. Tôi thích một nơi mà IRC được coi là một FS.
Journeyman Geek

Hmm - bạn biết đấy, tôi đã có ý định tìm kiếm nó từ rất lâu kể từ khi tìm hiểu qua một cuốn sách của Eric Raymond cách đây nhiều năm ... Cuối cùng bạn đã thực sự đưa tôi qua cái bướu "đi vòng quanh nó", tôi đã tải xuống ISO và thử nó.
Daniel Staple

2
Tôi tin rằng cũng có một phiên bản mới hơn, được gọi là inferno
Journeyman Geek

1
+1 để lưu ý rằng Darwin của OS X cũng là một 'Unix thực sự'.
calum_b

18

Vì các tập tin đặc biệt. Khi mọi người nói "mọi thứ đều là tệp trong Unix", các tệp và thư mục phổ biến không phải là thứ họ có trong đầu. Các tệp đặc biệt là duy nhất cho các hệ điều hành giống như Unix, trong đó có rất nhiều. Vì vậy, nó không phải là duy nhất để các Unix.

Các tập tin đặc biệt phục vụ nhiều mục đích. Có ví dụ như đường ống, ổ cắm và đáng chú ý nhất là các tập tin thiết bị. Ống và ổ cắm là luồng giao tiếp giữa các quá trình. Phần lớn chức năng của các hệ thống con được cung cấp cho không gian người dùng thông qua các tệp thiết bị.

Ống và ổ cắm

Các chương trình sử dụng chúng giống như họ sử dụng các tệp thông thường. Trên thực tế, hầu hết thời gian họ thậm chí không quan tâm đến loại tệp họ sử dụng. Đó là lý do tại sao các lệnh Unix có thể được kết hợp rất đa dạng để tạo thành các hệ thống mới mạnh mẽ. (Xem chuyển hướng I / O trong câu trả lời của mùn cưa)

Tập tin thiết bị

Như đã đề cập trước đây, các hành động này giống như các giao diện cho không gian người dùng. Ví dụ, để đẩy khay cd, trước tiên, một lập trình viên sẽ mở tệp thiết bị tương ứng. Một ví dụ khác: bạn muốn chương trình của bạn chuyển đổi thiết bị đầu cuối ảo. Mở / dev / console trước.

Chuyện gì xảy ra tiếp theo không được gửi chỉ ký tự để các tập tin, nhưng phát hành ioctl () 's trên chúng. Các ioctl riêng lẻ bạn có thể phát hành tùy thuộc vào thiết bị. Ví dụ: bàn điều khiển được ghi lại trong console_ioctl (4)


12

Tôi có lẽ sẽ bị say sưa khi nói điều này, nhưng tôi nghĩ rằng việc nói rằng mọi thứ là một tệp trong Unix thực tế là một lời ngụy biện. Những gì nó thực sự là hai điều.

  1. Các tệp và thiết bị (và rất nhiều thứ khác) là các đối tượng có thể được mô hình hóa bằng một giao diện bao gồm các chức năng mở, đóng, đọc, ghi và điều khiển (ioctl).
  2. Không gian tên cho các đối tượng này là phân cấp, tức là các đối tượng này được tổ chức theo thứ bậc.

Một hệ thống tập tin thực hiện không gian tên này và thực hiện khung cho phép gửi các chức năng giao diện đến các đối tượng này. Một hệ thống tệp lần đầu tiên được khái niệm hóa thành các tệp nhà, nhưng sau đó được chọn để tổ chức các đối tượng khác trong hệ thống phân cấp không gian tên. Một ví dụ về đa hình từ trước khi hướng đối tượng là một điều.

Không có hại trong việc chỉ gọi tất cả các tập tin. Nhưng trong thực tế, chúng là những đối tượng chung chung hơn (một tệp là một đối tượng như vậy). Từ quan điểm này, ý tưởng này không phải là duy nhất cho Unix. Rất nhiều hệ điều hành khác thực hiện hệ thống phân cấp các đối tượng đa hình như vậy.


Chính xác! Trong Unix mọi thứ đều là một bộ mô tả tệp (không nhất thiết phải là một tệp!), Tức là mọi thứ (trừ bộ nhớ) là I / O, thậm chí là các tệp. Các tệp phải được truy cập như thể chúng là các luồng I / O (mặc dù chúng có thể tìm kiếm được, do đó có thể truy cập ngẫu nhiên, nhưng chi phí cực cao của các cuộc gọi hệ thống phụ). (ngoại trừ những gì ít có thể được thực hiện với mmap()tất nhiên ....)
Greg A. Woods

9

Khi mọi người nói "Trong Unix, mọi thứ đều là một tệp", ý của họ là những thứ không phải là tệp được coi là tệp.

Tất nhiên hầu hết các hệ điều hành làm việc với các tập tin. Tập tin văn bản, tập tin hình ảnh, tập tin âm thanh. Nhưng không phải tất cả các hệ điều hành đều coi thiết bị là tập tin. Đó là một sự khác biệt quan trọng. Nếu tôi liệt kê nội dung của thư mục / dev / trong hệ điều hành Ubuntu của mình (dựa trên Unix), tôi sẽ nhận được danh sách hơn 200 thiết bị. Một số thiết bị đó là phần cứng, nhưng được hiển thị bên trong một thư mục. Ví dụ, ổ cứng, cổng USB, chuột và bàn phím, thiết bị âm thanh và máy in trong số những thứ khác. Một số thiết bị là ảo, ví dụ / dev / urandom, hoạt động như một tệp vô hạn chứa đầy đủ các số ngẫu nhiên. Nó không phải là một tập tin thực sự trên ổ cứng của tôi.

Tất cả những thiết bị đó được coi là tập tin. Tôi có thể đọc dữ liệu từ và / hoặc ghi dữ liệu vào các thiết bị đó. Ở đây có các ví dụ về sao chép dữ liệu từ các thiết bị khác nhau vào thiết bị âm thanh. Điều này là có thể bởi vì chúng được coi là tập tin. Kết quả (geeky) là khả năng nghe nội dung của ổ cứng, chuyển động chuột, bộ nhớ máy tính hoặc các pixel của hình ảnh. Điều này sẽ khó đạt được hơn nhiều nếu các thiết bị không được coi là tệp, bởi vì mỗi thiết bị sẽ yêu cầu các phương pháp khác nhau để đọc và ghi dữ liệu.

Điều đó đang được nói, "mọi thứ" có nghĩa là gì khác nhau tùy theo hệ thống. Ví dụ: OS X dựa trên Unix, nhưng không có thiết bị / dev / audio. Nó sử dụng một hệ thống âm thanh độc quyền gọi là CoreAudio. Vì vậy, trong trường hợp này, người ta có thể nói "hầu hết mọi thứ là một tập tin". Sau đó, trong các hệ thống như Windows, trong đó "mọi thứ không phải là tệp", bạn vẫn có thể thực hiện những việc như sao chép nội dung của tệp vào cổng máy in (gõ một cái gì đó như copy mydocument.txt >lpt1:), tương tự như sao chép tài liệu vào thiết bị máy in trong Unix hệ thống.

Các hệ điều hành khác như Windows và OS X không hoạt động trên các tệp? Có họ làm. Windows và OS X hoạt động trên các tệp, nhưng Windows không coi các thiết bị là tệp, đó là một phần của "mọi thứ là một tệp" nghĩa là gì.


8

Tôi thấy Multics được trích dẫn là nguồn gốc của "mọi thứ là một tệp", nhưng tôi nghĩ rằng bạn phải nhìn sâu hơn một chút so với chỉ các tệp thiết bị, các đường ống được đặt tên, các tệp thông thường, v.v. Bạn phải xem cú pháp đặt tên tệp. Điều đó tạo ra sự khác biệt lớn ngay cả khi AUX, CON và LP "tên tệp ma thuật" tồn tại.

Xem " Tên gớm ghiếc " của Rob Pike. Nó so sánh cú pháp đặt tên tệp Unix với một vài cú pháp khác, đáng chú ý nhất là VMS. Lưu ý rằng các hệ điều hành máy tính lớn vào cuối thập niên 60 / đầu thập niên 70, khi Unix bắt nguồn, có những gì mà bộ óc hiện đại sẽ xem xét cú pháp đặt tên tệp rococo đặc biệt. Đã nhiều năm kể từ khi tôi sử dụng VM / CMS, hoặc NOS hoặc NOS / VE và tôi chỉ nhìn qua vai một người nào đó sử dụng hệ điều hành Univac, nhưng đủ để nói rằng những điều kỳ quặc vượt trội so với các quy tắc.

Tôi thậm chí chưa bao giờ thấy Multics chạy, nhưng bạn có thể thấy một tờ giấy trên hệ thống tệp của nó . Có vẻ như Unix ban đầu đã lấy "mọi thứ là một tệp" xa hơn một chút so với Multics đã làm, nhưng số dặm của bạn có thể thay đổi.


1
Chà, trong Multics mọi thứ đều là bộ nhớ, ngoại trừ I / O (mặc dù điều đó cũng có thể được ánh xạ vào bộ nhớ). Trong Unix mọi thứ (trừ bộ nhớ) là một bộ mô tả tệp , bao gồm các tệp. Tức là trong Unix mọi thứ là I / O.
Greg A. Woods

1
BTW, một trình giả lập hiện tồn tại sẽ khởi động và chạy Multics.
Greg A. Woods

3

Xin lưu ý rằng ngay cả Linus Torvalds cũng không đồng ý với điều đó "mọi thứ đều là một tập tin". Nếu bạn tìm kiếm "

tất cả mọi thứ là một bytestream

"bạn sẽ tìm thấy những triết lý thú vị về cách chúng tôi muốn nói rằng mọi thứ không phải là một tệp, ví dụ cấu trúc dữ liệu trừu tượng trong bộ nhớ hoặc con trỏ chắc chắn không phải là một tệp, OK chắc chắn mọi thứ có thể được biểu diễn dưới dạng tệp nhưng đại diện và là 2 hành động khác nhau .


1
Bạn đã không cung cấp một liên kết. Trong một số tìm kiếm, tôi tìm thấy yarchive.net/comp/linux/everything_is_file.html , trích dẫn câu trả lời của Torvald trong một chuỗi email, trong đó anh ta khẳng định rằng mô hình phải là "mọi thứ đều là một tệp."
bgvaughan

1
Trên thực tế @bgvaughan thì ngược lại: yarchive.net/comp/linux/everything_is_file.html đưa ra trích dẫnThe UNIX philosophy is often quoted as "everything is a file", but that really means "everything is a stream of bytes".
Rừng cổ LIttle Kami

1
@LIttleAnellectForestKami: và Unix thường coi các tệp là các luồng byte đơn giản, trái ngược với các hệ thống coi các tệp là các luồng bản ghi (hoặc có cả luồng byte và luồng bản ghi), như các bộ sưu tập luồng (hoặc nhánh tài nguyên) hoặc có các mô hình phức tạp hơn, trong đó có một số cách khác nhau để truy cập vào một số loại đối tượng khác nhau.
ninjalj
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.