เหตุใด“ ทุกอย่างเป็นไฟล์” จึงไม่ซ้ำกับระบบปฏิบัติการ Unix


70

ฉันมักจะได้ยินคนพูดว่า "ปรัชญาที่เป็นเอกลักษณ์ของ Unix คือมันปฏิบัติต่อทุกสิ่งในรูปของไฟล์" หรือ "ใน Unix ทุกอย่างเป็นไฟล์" แต่ฉันไม่เคยได้ยินใครอธิบายว่าทำไม Unix ถึงเป็นเอกลักษณ์

แล้วทำไม Unix ถึงมีความพิเศษแบบนี้? ระบบปฏิบัติการอื่นเช่น Windows และ Mac ไม่ทำงานกับไฟล์หรือไม่?

และมันแตกต่างเมื่อเทียบกับระบบปฏิบัติการอื่นหรือไม่?


26
sidenote: macosx รันบน unix
akira

2
fwiw ในขณะที่สิ่งที่ระดับสูงกว่าไม่ได้ใช้ไฟล์ (เช่น dbus หรือ X ใน * nix) Windows ระดับต่ำนั้นสร้างขึ้นโดยใช้มือจับ คุณสามารถทำสิ่งเดียวกันกับพวกเขาได้มากมายเช่นเดียวกับไฟล์บน * nix (เปิดปิดควบคุมและมักจะส่ง / รับ) แต่คุณต้องมีโปรแกรมเมอร์เพื่อดูอินเตอร์เฟสนั้น ไม่ว่าจะเป็นสิ่งที่ดีเป็นเรื่องของการตั้งค่า
ทำเครื่องหมาย

1
ทุกอย่างเป็นไฟล์ยกเว้นส่วนต่อประสานเครือข่าย
อัลวิน

8
@akira - OSX ได้รับการรับรอง Unix และไม่เรียกใช้ "ด้านบน"
Rob

1
@akira ไม่ได้อยู่บน Unix OSX เป็นหนึ่งในไม่กี่ระบบปฏิบัติการที่ได้รับการรับรอง UNIX
Let_Me_Be

คำตอบ:


53

แล้วทำไม Unix ถึงมีความพิเศษแบบนี้?

ระบบปฏิบัติการทั่วไปก่อนหน้า Unix จะทำการจัดการไฟล์ทางเดียวและจัดการอุปกรณ์ต่อพ่วงแต่ละอันตามลักษณะของอุปกรณ์นั้น นั่นคือถ้าผลลัพธ์ของโปรแกรมถูกเขียนไปยังไฟล์บนดิสก์นั่นเป็นที่เดียวที่เอาต์พุตสามารถไปได้ คุณไม่สามารถส่งไปยังเครื่องพิมพ์หรือเทปไดรฟ์ แต่ละโปรแกรมจะต้องระวังอุปกรณ์แต่ละตัวที่ใช้สำหรับอินพุตและเอาต์พุตและมีตัวเลือกคำสั่งเพื่อจัดการกับอุปกรณ์ I / O สำรอง

Unix ปฏิบัติต่ออุปกรณ์ทั้งหมดเป็นไฟล์ แต่มีคุณสมบัติพิเศษ เพื่อให้โปรแกรมง่ายขึ้นอินพุตมาตรฐานและเอาต์พุตมาตรฐานคืออุปกรณ์อินพุตและเอาต์พุตมาตรฐานของโปรแกรม ดังนั้นผลลัพธ์ของโปรแกรมตามปกติสำหรับหน้าจอคอนโซลสามารถไปได้ทุกที่ไปยังดิสก์ไฟล์หรือเครื่องพิมพ์หรือพอร์ตอนุกรม นี้เรียกว่าI / O เปลี่ยนเส้นทาง

ระบบปฏิบัติการอื่นเช่น Windows และ Mac ไม่ทำงานกับไฟล์หรือไม่?

แน่นอนว่าระบบปฏิบัติการที่ทันสมัยทั้งหมดรองรับระบบไฟล์ที่หลากหลายและสามารถ "ทำงานกับไฟล์" ได้ แต่ความแตกต่างคือวิธีการจัดการอุปกรณ์? ไม่ทราบเกี่ยวกับ Mac แต่ Windows ให้การเปลี่ยนเส้นทาง I / O บางอย่าง

และเปรียบเทียบกับระบบปฏิบัติการอื่น ๆ ที่มีเอกลักษณ์?

ไม่ได้จริงๆอีกต่อไป Linux มีคุณสมบัติเดียวกัน แน่นอนว่าหากระบบปฏิบัติการใช้การเปลี่ยนเส้นทาง I / O แสดงว่ามีแนวโน้มที่จะใช้คุณสมบัติ Unix อื่น ๆ และท้ายที่สุดก็เหมือนกับ Unix ในที่สุด


29
โดยทั่วไป OS X เป็น Unix ดังนั้นจึงมีความแตกต่างไม่มาก
slhck

6
มีมากขึ้นอีกนิดกับทุกสิ่งที่รูปแบบไฟล์
artistoex

1
ย่อหน้าเปิดนั้นไม่เป็นความจริง มีระบบปฏิบัติการก่อนยูนิกซ์และพวกเขามีคุณสมบัติที่พบใน Unix ในภายหลังรวมถึงการเปลี่ยนเส้นทาง I / O
Patrick Seymour เมื่อ

3
Plan 9 มีแนวคิดเดียวกันทุกอย่างเป็นแนวคิดของไฟล์และถูกเรียกว่า "unix มากกว่า unix แล้ว"
William

2
Windows (ตั้งแต่ NT) ค่อนข้างละเอียดกว่านี้ มีอุปกรณ์จำนวนมากที่ทำงานเหมือนไฟล์เช่นพอร์ตอนุกรมและชื่อไปป์ WriteFileคุณสามารถเขียนให้ทั้งหมดโดยใช้ แต่นอกจากนี้ยังมีหมวดหมู่ที่ใหญ่กว่าของ "ออบเจ็กต์การซิงโครไนซ์" ที่ไม่เพียง แต่รวมถึงไฟล์เท่านั้น
MSalters

34

แนวคิดที่ว่า "ทุกอย่างเป็นไฟล์" มาจาก Multics นักออกแบบของ Unix ใช้งานจำนวนมากกับรุ่นก่อนหน้าโดยเฉพาะ Multics แท้จริงแล้วสิ่งต่างๆมากมายในการคำนวณนั้นขึ้นอยู่กับรุ่นก่อน

คุณสามารถอ่านผลงานของ Dennis Ritchie ปลายในการออกแบบ Unix ได้มากขึ้น เขาอ้างถึงสิ่งที่พวกเขา "คัดลอก" จาก Multics เช่นระบบไฟล์แบบต้นไม้เปลือกคำสั่งและการจัดโครงสร้างไฟล์ที่ไม่มีโครงสร้าง ฉันไม่ได้หมายความว่าคน Unix ขโมยมาจาก Multics folks สำหรับทุกเจตนาและวัตถุประสงค์มันเป็นคนเดียวกัน


6
นี่ไม่ควรเป็นคำตอบที่ได้รับการโหวตสูงสุด แต่ไม่ได้ตอบคำถามมันแค่ขอให้ผู้คนถามคำถามอื่น: "ทำไม 'ทุกอย่างเป็นไฟล์' ใน Multics?"
Lie Ryan

13
@LieRyan: จริงๆแล้วมันจะตอบคำถามที่ว่าทำไมมันไม่เหมือนใคร : ไม่ใช่
Goran Jovic

1
ผู้ใช้ Unix เพิ่งนำความคิดของพวกเขาไปด้วยเมื่อโครงการ Multics ถูกยกเลิกและเปลี่ยนชื่อเป็น Unix แค่เล่นกับคำศัพท์ - หนึ่ง VS หลาย ๆ
Fiasco Labs

2
@Lie Ryan - คำถามไม่ใช่ว่าทำไมทุกอย่างถึงเป็นไฟล์ อย่างที่ฉันและ Goran ชี้ให้เห็นมันไม่ใช่
Patrick Seymour เมื่อ

1
คำถามจริงๆหมายถึง "ระบบปฏิบัติการ Unix s " คือครอบครัว ครอบครัวนั้นมีเหตุผลรวมถึง Multics และ Linux
MSalters

28

ไม่ซ้ำ? เลขที่กำหนด? อย่างแน่นอน

การมีทุกอย่างเป็นไฟล์หรืออุปกรณ์ในลำดับชั้นที่รู้จักหมายถึงคุณสามารถใช้ชุดเครื่องมือเดียวกันสำหรับทุกสิ่ง Plan 9 จาก Bell Labsใช้เวลานี้มากขึ้นด้วยอุปกรณ์ฮาร์ดแวร์เป็นไฟล์

ที่สำคัญกว่านี้จะช่วยให้แนวคิดง่าย ๆ และทรงพลังสองอย่าง สาธารณูปโภคขั้นพื้นฐานที่ทำสิ่งหนึ่งสิ่งที่ดี (tm) ซึ่งสามารถหงุดหงิดพร้อมกับท่อได้ตามต้องการ ต้องการหาบางอย่างในไฟล์ข้อความหรือไม่? ใช้catแสดงมันผ่านมันgrepและคุณกำลังปรุงอาหารด้วยแก๊ส นั่นคือพลังที่แท้จริงของวิธี 'Unix' - แอพพลิเคชั่นพิเศษที่ทำงานร่วมกันเพื่อความยืดหยุ่นอย่างมาก

Mac OS X ยังตามปรัชญา Unix แต่มันซ่อนอยู่ที่ดีขึ้น (เป็น 'แอพลิเคชัน' มัดเป็นจริงไดเรกทอรีเต็มรูปแบบของไฟล์) และในความเป็นจริงที่เหมาะสมได้รับการรับรองระบบปฏิบัติการยูนิกซ์สืบเชื้อสายมาจากNeXTซึ่งใช้เศษFreeBSD

สำหรับ Windows นั้นมีส่วนประกอบไบนารีบางส่วนเช่นตัวแสดงเหตุการณ์และการลงทะเบียนเนื่องจากและมีข้อได้เปรียบด้านความเร็วในกรณีนั้น


1
บวก 1 สำหรับการกล่าวถึงแผน 9 IMHO Fuse นำแผน 9 เข้าใกล้การนำไปปฏิบัติโดยผ่านกิจกิจและการวนซ้ำ
Danny Staple

2
เอาล่ะแผน 9 คือแผน 9 มันเรียงลำดับแล้วใช้ได้ ฟิวส์ช่วยให้ขยายระบบไฟล์ userspace ได้อย่างน่าสนใจ ฉันชอบสิ่งที่ IRC ถือเป็น FS
Geek

อืม - คุณรู้ไหมว่าฉันตั้งใจจะหามันมานานแล้วนับตั้งแต่ค้นพบผ่านหนังสือ Eric Raymond เมื่อหลายปีก่อน ... ในที่สุดคุณก็ได้พาฉันไปที่ "ได้รับมัน" hump ฉันดาวน์โหลด ISO และทดลองใช้
Danny Staple

2
ฉันเชื่อว่ามีเวอร์ชั่นใหม่กว่านี้เช่นกันเรียกว่านรก
Journeyman Geek

1
+1 สำหรับการสังเกตว่าดาร์วินของ OS X นั้นเป็น 'Unix จริง' เช่นกัน
calum_b

18

เพราะไฟล์พิเศษ เมื่อผู้คนพูดว่า "ทุกอย่างเป็นไฟล์ใน Unix" ไฟล์และไดเรกทอรีทั่วไปไม่ใช่สิ่งที่พวกเขามีอยู่ในใจ ไฟล์พิเศษมีลักษณะเฉพาะกับระบบปฏิบัติการ Unix ซึ่งมีมากมาย ดังนั้นมันจะไม่ซ้ำกับยูนิกซ์

ไฟล์พิเศษรองรับวัตถุประสงค์มากมาย มีเช่นท่อซ็อกเก็ตและที่สำคัญที่สุดคือไฟล์อุปกรณ์ ท่อและซ็อกเก็ตเป็นสตรีมการสื่อสารระหว่างกระบวนการ ฟังก์ชั่นส่วนใหญ่ของระบบย่อยถูกทำให้พร้อมใช้งานสำหรับพื้นที่ผู้ใช้ผ่านไฟล์อุปกรณ์

ท่อและซ็อกเก็ต

โปรแกรมใช้งานได้เช่นเดียวกับที่ใช้ไฟล์ธรรมดา ในความเป็นจริงส่วนใหญ่เวลาที่พวกเขาไม่สนใจแม้แต่ประเภทไฟล์ที่พวกเขาใช้ นั่นเป็นเหตุผลที่คำสั่ง Unix สามารถรวมกันอย่างมากมายเพื่อสร้างระบบใหม่ที่มีประสิทธิภาพ (ดูการเปลี่ยนเส้นทาง I / O ตามคำตอบของขี้เลื่อย)

ไฟล์อุปกรณ์

ดังกล่าวก่อนหน้านี้การกระทำเหล่านี้เช่นอินเทอร์เฟซสำหรับพื้นที่ผู้ใช้ ตัวอย่างเช่นในการดีดถาดซีดีออกในตอนแรกโปรแกรมเมอร์จะเปิดไฟล์อุปกรณ์ที่เกี่ยวข้อง อีกตัวอย่าง: คุณต้องการให้โปรแกรมสลับเทอร์มินัลเสมือน เปิด / dev / console ก่อน

จะเกิดอะไรขึ้นต่อไปคือการไม่ส่งตัวอักษรเพียงเพื่อไฟล์เหล่านั้น แต่การออกIOCTL () 's เกี่ยวกับพวกเขา IOCTL ของแต่ละบุคคลที่คุณสามารถออกได้ขึ้นอยู่กับอุปกรณ์ เช่นคอนโซลมีการบันทึกไว้ในconsole_ioctl (4)


12

ฉันอาจจะได้รับการ reamed สำหรับการพูดแบบนี้ แต่ฉันคิดว่าการบอกว่าทุกอย่างเป็นไฟล์ใน Unix นั้นเป็นความเข้าใจผิด สิ่งที่เป็นจริงคือสองสิ่ง

  1. ไฟล์และอุปกรณ์ (และอื่น ๆ อีกมากมาย) เป็นวัตถุที่สามารถสร้างแบบจำลองโดยส่วนต่อประสานที่ประกอบด้วยฟังก์ชั่นเปิดปิดอ่านเขียนและควบคุม (ioctl)
  2. เนมสเปซสำหรับวัตถุเหล่านี้เป็นลำดับชั้นกล่าวคือวัตถุเหล่านี้ถูกจัดระเบียบในลำดับชั้น

ระบบไฟล์ใช้เนมสเปซนี้และใช้เฟรมเวิร์กที่อนุญาตให้มีการส่งฟังก์ชั่นอินเตอร์เฟสไปยังวัตถุเหล่านี้ ระบบไฟล์ถูกกำหนดแนวคิดให้กับไฟล์เฮ้าส์เป็นครั้งแรก แต่จากนั้นเลือกที่จะจัดระเบียบวัตถุอื่นในลำดับชั้นของเนมสเปซ ตัวอย่างของความแตกต่างจากก่อนวัตถุเชิงเป็นสิ่ง

ไม่มีอันตรายใด ๆ ในการเรียกไฟล์ทุกอย่าง แต่ในความเป็นจริงพวกมันเป็นวัตถุที่พบได้ทั่วไปมากกว่า จากมุมมองนี้ความคิดนี้ไม่ซ้ำกับ Unix เลย ระบบปฏิบัติการอื่น ๆ จำนวนมากใช้ลำดับชั้นของวัตถุ polymorphic


แน่นอน! ใน Unix ทุกอย่างเป็น file descriptor (ไม่จำเป็นต้องเป็นไฟล์!), ทุกอย่าง (ยกเว้นหน่วยความจำ) คือ I / O, แม้แต่ไฟล์ ไฟล์ต้องสามารถเข้าถึงได้ราวกับว่าพวกเขาเป็นสตรีม I / O (แม้ว่าพวกเขาจะสามารถค้นหาได้ดังนั้นจึงสามารถเข้าถึงได้โดยการสุ่ม แต่ค่าใช้จ่ายที่สูงมากในการเรียกใช้ระบบเพิ่มเติม) (ยกเว้นสิ่งที่สามารถทำได้เล็กน้อยด้วยmmap()แน่นอน .... )
Greg A. Woods

9

เมื่อมีคนพูดว่า "ในระบบปฏิบัติการยูนิกซ์ทุกอย่างเป็นไฟล์" สิ่งที่พวกเขาหมายถึงก็คือสิ่งต่าง ๆ ที่ไม่ใช่ไฟล์จะถือว่าเป็นไฟล์

แน่นอนว่าระบบปฏิบัติการส่วนใหญ่ทำงานกับไฟล์ได้ ไฟล์ข้อความ, ไฟล์รูปภาพ, ไฟล์เสียง แต่ไม่ใช่ว่าระบบปฏิบัติการทั้งหมดจะใช้อุปกรณ์เป็นไฟล์ นั่นคือความแตกต่างที่สำคัญ ถ้าฉันแสดงรายการเนื้อหาของ / dev / โฟลเดอร์ในระบบปฏิบัติการ Ubuntu ของฉัน (ซึ่งใช้ Unix) ฉันจะได้รับรายชื่ออุปกรณ์มากกว่า 200 รายการ อุปกรณ์เหล่านั้นบางส่วนเป็นฮาร์ดแวร์ แต่จะแสดงอยู่ในโฟลเดอร์ ตัวอย่างเช่นฮาร์ดไดรฟ์พอร์ต USB เมาส์และคีย์บอร์ดอุปกรณ์เสียงและเครื่องพิมพ์อื่น ๆ อุปกรณ์บางอย่างเป็นเสมือนตัวอย่างเช่น / dev / urandom ซึ่งทำงานเป็นไฟล์ไม่มีที่สิ้นสุดซึ่งเต็มไปด้วยตัวเลขสุ่ม มันไม่ใช่ไฟล์จริงในฮาร์ดไดรฟ์ของฉัน

อุปกรณ์เหล่านั้นทั้งหมดถือเป็นไฟล์ ฉันสามารถอ่านข้อมูลจากและ / หรือเขียนข้อมูลลงในอุปกรณ์เหล่านั้นได้ นี่คือตัวอย่างของการคัดลอกข้อมูลจากอุปกรณ์ต่าง ๆ ลงในอุปกรณ์เสียง สิ่งนี้เป็นไปได้เพราะจะถือว่าเป็นไฟล์ ผลลัพธ์ (geeky) คือความสามารถในการฟังเนื้อหาของฮาร์ดไดรฟ์การเคลื่อนไหวของเมาส์หน่วยความจำคอมพิวเตอร์หรือพิกเซลของรูปภาพ สิ่งนี้จะยากกว่านี้หากอุปกรณ์ไม่ได้รับการปฏิบัติเหมือนเป็นไฟล์เพราะแต่ละอุปกรณ์จะต้องใช้วิธีการต่าง ๆ ในการอ่านและเขียนข้อมูล

ที่ถูกกล่าวว่า "ทุกอย่าง" หมายถึงสิ่งที่แตกต่างจากระบบไปยังระบบ ตัวอย่างเช่น OS X ใช้ Unix แต่ไม่มีอุปกรณ์ / dev / audio จะใช้ระบบเสียงที่เป็นกรรมสิทธิ์ที่เรียกว่า CoreAudio ดังนั้นในกรณีนี้เราอาจพูดว่า "เกือบทุกอย่างเป็นไฟล์" จากนั้นในระบบเช่น Windows ที่ "ทุกอย่างไม่ใช่ไฟล์" คุณยังสามารถทำสิ่งต่าง ๆ เช่นคัดลอกเนื้อหาของไฟล์ไปยังพอร์ตเครื่องพิมพ์ (พิมพ์บางอย่างcopy mydocument.txt >lpt1:) ซึ่งคล้ายกับการคัดลอกเอกสารไปยังอุปกรณ์เครื่องพิมพ์ใน Unix ระบบ

ระบบปฏิบัติการอื่นเช่น Windows และ OS X ไม่ทำงานกับไฟล์หรือไม่? ใช่. Windows และ OS X ทำงานบนไฟล์ แต่ Windows ไม่ถือว่าอุปกรณ์เป็นไฟล์ซึ่งเป็นส่วนหนึ่งของความหมายของ "ทุกอย่างเป็นไฟล์"


8

ฉันเห็น Multics อ้างถึงเป็นแหล่งที่มาของ "ทุกอย่างเป็นไฟล์" แต่ฉันคิดว่าคุณต้องดูให้ลึกกว่าไฟล์อุปกรณ์ชื่อไปป์ไฟล์ปกติ ฯลฯ ฯลฯ คุณต้องดูไวยากรณ์การตั้งชื่อไฟล์ สิ่งนี้ทำให้เกิดความแตกต่างอย่างมากแม้ว่าจะมีชื่อ "ไฟล์มายากล" AUX, CON และ LP อยู่ก็ตาม

ดู " ชื่อน่าเกลียด " โดย Rob Pike มันเปรียบเทียบไวยากรณ์การตั้งชื่อไฟล์ Unix กับไวยากรณ์อื่น ๆ อีกสอง VMS ที่สะดุดตาที่สุด โปรดทราบว่าระบบปฏิบัติการเมนเฟรมของปลายยุค 60 / ต้นยุค 70 เมื่อ Unix เกิดขึ้นมีสิ่งที่จิตใจที่ทันสมัยจะพิจารณาการตั้งชื่อไฟล์โรโคโคไฟล์พิเศษ เป็นเวลาหลายปีแล้วที่ฉันใช้ VM / CMS หรือ NOS หรือ NOS / VE และฉันมองข้ามไหล่คนที่ใช้ Univac OS เท่านั้น

ผมไม่เคยเห็นแม้แต่ Multics ทำงาน แต่คุณสามารถดูกระดาษบนระบบไฟล์ ดูเหมือนว่า Unix ดั้งเดิมจะใช้ "ทุกอย่างเป็นไฟล์" มากกว่าที่ Multics ทำ แต่ระยะทางของคุณอาจแตกต่างกันไป


1
ใน Multics ทุกอย่างคือหน่วยความจำยกเว้น I / O (แม้ว่ามันจะถูกแมปไปยังหน่วยความจำด้วยก็ตาม) ใน Unix ทุกอย่าง (ยกเว้นหน่วยความจำ) เป็นตัวบ่งชี้ไฟล์รวมถึงไฟล์ Ie ใน Unix ทุกอย่างคือ I / O
Greg A. Woods

1
BTW อีมูเลเตอร์มีอยู่แล้วที่จะทำการบูตและรัน Multics
Greg A. Woods

3

โปรดทราบว่าแม้แต่ Linus Torvalds ก็ไม่เห็นด้วยกับ "ทุกอย่างเป็นไฟล์" หากคุณค้นหา "

ทุกอย่างเป็น bytestream

"คุณจะพบกับปรัชญาที่น่าสนใจว่าเราหมายความว่าทุกอย่างไม่ใช่ไฟล์ตัวอย่างเช่นโครงสร้างข้อมูลนามธรรมในหน่วยความจำหรือตัวชี้ไม่ใช่ไฟล์แน่นอนว่าทุกสิ่งสามารถแสดงเป็นไฟล์ได้ .


1
คุณไม่ได้ให้ลิงค์ ในการค้นหาบางอย่างฉันพบyarchive.net/comp/linux/everything_is_file.htmlโดยอ้างถึงคำตอบของ Torvald ในกระทู้ทางอีเมลซึ่งเขายืนยันโดยนัยว่าโมเดลควรเป็น "ทุกอย่างเป็นไฟล์"
bgvaughan

1
ที่จริงแล้ว @ bgvaughan มันเป็นสิ่งที่ตรงกันข้าม: yarchive.net/comp/linux/everything_is_file.htmlให้คำพูดThe UNIX philosophy is often quoted as "everything is a file", but that really means "everything is a stream of bytes".
LIttle Ancient Forest Kami

1
@LIttleAncientForestKami: และ Unix ถือว่าไฟล์เป็นแบบสตรีมของไบต์ซึ่งต่างจากระบบที่ถือว่าไฟล์เป็นสตรีมของเรคคอร์ด (หรือมีทั้งสตรีมของไบต์และสตรีมเรคคอร์ด) เป็นคอลเลกชันของสตรีม (หรือส้อมทรัพยากร) หรือมี แบบจำลองที่ซับซ้อนมากขึ้นซึ่งมีวิธีการเข้าถึงวัตถุที่แตกต่างหลากหลายหลายวิธี
ninjalj
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.