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