อธิบายไฟล์และทางแยก


15

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

เมื่อกระบวนการเรียกใช้closeฟังก์ชันเพื่อปิดไฟล์ที่เปิดเฉพาะผ่าน file descriptor ในตารางไฟล์ของกระบวนการจำนวนการอ้างอิงจะลดลงหนึ่งรายการ แต่เนื่องจากพาเรนต์และชายด์กำลังถือไฟล์เดียวกันการนับการอ้างอิงคือ 2 และหลังจากปิดจึงลดลงเหลือ 1 เนื่องจากกระบวนการไม่เป็นศูนย์กระบวนการยังคงใช้ไฟล์ต่อโดยไม่มีปัญหาใด ๆ

ดูที่การเขียนโปรแกรมระบบ UNIX ของ Terrence Chan (รองรับเคอร์เนล Unix สำหรับไฟล์)


เอาล่ะอย่าคิดว่าความคิดเห็นสุดท้าย;) ใน man pages สำหรับopen()และfork()มีความแตกต่างระหว่างfile descript - หรือกับไฟล์ descipt-ion - ที่เก่าอ้างถึงในภายหลังและแม้ว่า descriptors ใน fork จะเป็น copy พวกเขาอ้างถึงคำอธิบายเดียวกัน อย่างไรก็ตามเมื่อทดสอบแล้วเห็นได้ชัดว่านี่ไม่ได้หมายความว่าการปิดที่จับของเด็กจะปิดที่จับของผู้ปกครอง ฉันคิดว่ามันอาจสร้างความแตกต่างที่ละเอียดอ่อนต่อการสอดแทรกข้อมูลเมื่อทั้งสองจัดการการเขียน - แต่มันก็ไม่ได้กำหนดแน่ชัดแล้วดังนั้นสิ่งที่เกิดขึ้นนั้นไม่สำคัญเลย
goldilocks

คำตอบ:


29

เมื่อเด็กถูกแยกแล้วมันจะสืบทอดตัวบ่งชี้ไฟล์ของผู้ปกครองถ้าเด็กปิดตัวอธิบายไฟล์จะเกิดอะไรขึ้น?

มันสืบทอดสำเนาของ file descriptor ดังนั้นการปิด descriptor ในเด็กจะปิดลงเพื่อเด็ก แต่ไม่ใช่ผู้ปกครองและในทางกลับกัน

หากเด็กเริ่มเขียนสิ่งที่จะเกิดขึ้นกับไฟล์ที่ส่วนท้ายของผู้ปกครอง? ใครเป็นผู้จัดการความไม่สอดคล้องกันเคอร์เนลหรือผู้ใช้เหล่านี้

มันเหมือนกันทุกประการเหมือนกับสองกระบวนการที่เขียนไปยังไฟล์เดียวกัน เคอร์เนลกำหนดเวลากระบวนการอย่างอิสระดังนั้นคุณน่าจะได้รับข้อมูล interleaved ในไฟล์

อย่างไรก็ตามPOSIX (ซึ่งระบบ * nix ส่วนใหญ่หรือสอดคล้องกันอย่างสมบูรณ์) กำหนดว่าread()และwrite()ฟังก์ชั่นจาก C API (ซึ่งแมปไปยังการเรียกระบบ) เป็น "อะตอมด้วยความเคารพซึ่งกันและกัน [... ] เมื่อพวกเขาทำงานกับไฟล์ปกติหรือ ลิงก์สัญลักษณ์ ". GNU C ยังให้สัญญาแบบชั่วคราวเกี่ยวกับPIPE_BUFไพพ์(หมายเหตุค่าเริ่มต้นซึ่งเป็นส่วนหนึ่งของเงื่อนไขคือ 64 kiB) ซึ่งหมายความว่าการโทรในภาษา / เครื่องมืออื่น ๆ เช่นการใช้echoหรือcatควรรวมอยู่ในสัญญานั้นดังนั้นหากสองกระบวนการอิสระพยายามเขียน "hello" และ "โลก" พร้อมกันในท่อเดียวกันสิ่งที่จะออกมาอีก ท้ายที่สุดก็คือ "helloworld" หรือ "worldhello" และไม่มีอะไรเหมือน "

เมื่อกระบวนการเรียกใช้ฟังก์ชันปิดเพื่อปิดไฟล์ที่เปิดโดยเฉพาะผ่าน file descriptor ตารางไฟล์ของกระบวนการลดจำนวนการอ้างอิงโดยหนึ่ง แต่เนื่องจากผู้ปกครองและเด็กทั้งสองกำลังถือไฟล์เดียวกัน (มีจำนวน refrence เป็น 2 และหลังจากปิดมันลด 1) เนื่องจากมันไม่ได้เป็นศูนย์ดังนั้นกระบวนการยังคงใช้ไฟล์ต่อโดยไม่มีปัญหา

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


1

เมื่อใดก็ตามfork()ที่สร้างลูกใหม่ตัวอธิบายไฟล์จะไม่ถูกเก็บไว้เลย - มันจะเปลี่ยนไป

แม้ว่าไฟล์จะซ้ำกัน แต่ก็จะมีตัวอธิบายไฟล์ที่แตกต่างกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.