จริงๆแล้วมันค่อนข้างง่ายอย่างน้อยถ้าคุณไม่ต้องการรายละเอียดการใช้งาน
ก่อนอื่นบน Linux ระบบไฟล์ทั้งหมด (ext2, ext3, btrfs, reiserfs, tmpfs, zfs, ... ) ถูกนำมาใช้ในเคอร์เนล บางคนอาจลดการทำงานของรหัสผู้ใช้ผ่าน FUSE และบางคนมาในรูปแบบของโมดูลเคอร์เนลเท่านั้น ZFS ดั้งเดิม เป็นตัวอย่างที่น่าสังเกตของหลังเนื่องจากข้อ จำกัด สิทธิ์ใช้งาน) แต่อย่างใดยังมีองค์ประกอบเคอร์เนล นี่เป็นพื้นฐานที่สำคัญ
เมื่อโปรแกรมต้องการอ่านจากไฟล์มันจะทำการเรียกไลบรารี่ของระบบต่างๆ open()
, read()
, close()
ลำดับ (อาจจะด้วย seek()
โยนทิ้งเพื่อวัดผลที่ดี) เคอร์เนลใช้พา ธ และชื่อไฟล์ที่ให้มาและผ่านระบบไฟล์และเลเยอร์ I / O อุปกรณ์จะแปลสิ่งเหล่านี้เป็นการร้องขอการอ่านแบบฟิสิคัล
อย่างไรก็ตาม ไม่จำเป็นต้องแปลคำขอเหล่านั้นเป็นพิเศษ ทางกายภาพถาวร การเก็บรักษา . สัญญาของเคอร์เนลคือการออกชุดการเรียกของระบบโดยเฉพาะ ระบุเนื้อหาของไฟล์ที่เป็นปัญหา . ตรงไหนในขอบเขตทางกายภาพของเรา "ไฟล์" ที่มีอยู่จะเป็นรอง
บน /proc
มักจะติดตั้งสิ่งที่เรียกว่า procfs
. นั่นคือประเภทระบบไฟล์พิเศษ แต่เนื่องจากเป็นระบบไฟล์จึงไม่แตกต่างจากเช่นจริง ๆ ext3
ติดตั้งระบบไฟล์บางแห่ง ดังนั้นคำขอจะถูกส่งผ่านไปยังรหัสไดรเวอร์ระบบไฟล์ procfs ซึ่งรู้เกี่ยวกับไฟล์และไดเรกทอรีทั้งหมด และส่งคืนข้อมูลบางส่วนจากโครงสร้างข้อมูลเคอร์เนล .
"ชั้นการจัดเก็บ" ในกรณีนี้คือโครงสร้างข้อมูลเคอร์เนลและ procfs
ให้อินเทอร์เฟซที่สะอาดและสะดวกในการเข้าถึง โปรดทราบว่าการติดตั้ง procfs ที่ /proc
เป็นแบบแผนเพียง; คุณสามารถติดตั้งที่อื่นได้อย่างง่ายดาย ในความเป็นจริงแล้วบางครั้งก็ทำเช่นใน chroot jails เมื่อกระบวนการทำงานที่นั่นต้องการเข้าถึง / proc ด้วยเหตุผลบางอย่าง
มันทำงานในลักษณะเดียวกันถ้าคุณเขียนค่าลงไฟล์ ที่ระดับเคอร์เนลซึ่งแปลเป็นชุดของ open()
, seek()
, write()
, close()
การโทรซึ่งจะถูกส่งผ่านไปยังไดรเวอร์ระบบไฟล์ อีกครั้งในกรณีนี้รหัส procfs
เหตุผลเฉพาะที่คุณเห็น file
การคืน empty
คือไฟล์จำนวนมากที่เปิดเผยโดย procfs ถูกเปิดเผยด้วย ขนาด 0 ไบต์ ขนาด 0 ไบต์น่าจะเป็นการเพิ่มประสิทธิภาพทางด้านเคอร์เนล (ไฟล์จำนวนมากใน / proc เป็นแบบไดนามิกและสามารถเปลี่ยนแปลงความยาวได้อย่างง่ายดายแม้จากการอ่านหนึ่งไปยังอีกการอ่านต่อไป อาจมีราคาแพงมาก) ไปตามความเห็นต่อคำตอบนี้ซึ่งคุณสามารถตรวจสอบในระบบของคุณเองโดยใช้งานผ่าน strace หรือเครื่องมือที่คล้ายกัน file
ประเด็นแรก stat()
เรียกใช้เพื่อตรวจจับไฟล์พิเศษใด ๆ จากนั้นใช้โอกาสหากขนาดไฟล์ถูกรายงานเป็น 0 ให้ยกเลิกและรายงานว่าไฟล์นั้นว่างเปล่า
พฤติกรรมนี้ได้รับการบันทึกไว้จริงและสามารถเป็นได้ แทนที่โดยการระบุ -s
หรือ --special-files
บน file
การภาวนา แม้ว่าตามที่ระบุไว้ในหน้าคู่มือที่อาจมีผลข้างเคียง ข้อความด้านล่างมาจากไฟล์ BSD 5.11 หน้าคนลงวันที่ 17 ตุลาคม 2011
โดยปกติไฟล์จะพยายามอ่านและกำหนดประเภทของไฟล์อาร์กิวเมนต์ที่รายงานสถิติ (2) เป็นไฟล์ธรรมดา วิธีนี้ช่วยป้องกันปัญหาเนื่องจากการอ่านไฟล์พิเศษอาจมีผลกระทบที่แปลกประหลาด การระบุ -s
ตัวเลือกทำให้ไฟล์ยังอ่านไฟล์อาร์กิวเมนต์ซึ่งเป็นไฟล์พิเศษของบล็อกหรือตัวละคร สิ่งนี้มีประโยชน์สำหรับการพิจารณาประเภทระบบแฟ้มของข้อมูลในพาร์ติชันดิสก์ดิบซึ่งเป็นไฟล์พิเศษที่ถูกบล็อก ตัวเลือกนี้ยังทำให้ไฟล์ไม่สนใจขนาดไฟล์ตามที่รายงานโดย stat (2) เนื่องจากในบางระบบจะรายงานขนาดเป็นศูนย์สำหรับพาร์ติชันดิสก์ดิบ
strace file /proc/version
หรือltrace -S /proc/version
การเพิ่มประสิทธิภาพค่อนข้างเล็ก มันเป็นstat()
โทรก่อนและพบว่าขนาดเป็น 0 จึงข้ามการopen()
- แต่ก่อนหน้านั้นโหลดไฟล์มายากลหลายไฟล์