สมมติว่าฉันอ่าน (cat) ไฟล์ในขณะที่กระบวนการอื่นกำลังเขียนเนื้อหาใหม่ ผลผลิตสามารถคาดการณ์ได้หรือไม่ อะไรจะเกิดขึ้น?
สมมติว่าฉันอ่าน (cat) ไฟล์ในขณะที่กระบวนการอื่นกำลังเขียนเนื้อหาใหม่ ผลผลิตสามารถคาดการณ์ได้หรือไม่ อะไรจะเกิดขึ้น?
คำตอบ:
ขึ้นอยู่กับสิ่งที่ผู้เขียนทำ
หากผู้เขียนเขียนทับไฟล์ที่มีอยู่แล้วผู้อ่านจะเห็นเนื้อหาใหม่เมื่อผู้เขียนเขียนทับผู้อ่านถ้าเคย หากผู้เขียนและผู้อ่านดำเนินการที่ความเร็วตัวแปรผู้อ่านอาจดูเนื้อหาเก่าและใหม่
หากผู้เขียนตัดไฟล์ก่อนที่จะเริ่มเขียนผู้อ่านจะทำงานต่อท้ายไฟล์ที่จุดนั้น
หากผู้เขียนสร้างไฟล์ใหม่ให้ย้ายไฟล์ใหม่ไปยังชื่อเก่าผู้อ่านจะอ่านต่อไปจากไฟล์เก่า หากไฟล์ที่เปิดถูกย้ายหรือลบออกกระบวนการที่มีไฟล์เปิดอยู่จะอ่านจากไฟล์เดียวกันนั้น หากไฟล์ถูกลบมันจะยังคงอยู่บนดิสก์ (แต่ไม่มีทางเปิดอีกครั้ง) จนกว่ากระบวนการสุดท้ายจะปิดมัน
ระบบปฏิบัติการ Unix มีแนวโน้มที่จะไม่ให้มีผลบังคับใช้ล็อค หากแอปพลิเคชันต้องการตรวจสอบให้แน่ใจว่าส่วนประกอบนักเขียนและส่วนประกอบเครื่องอ่านไม่ได้อยู่ที่นิ้วเท้าของกันและกันมันก็ขึ้นอยู่กับผู้พัฒนาที่จะใช้การล็อคที่เหมาะสม มีข้อยกเว้นบางประการที่ไฟล์ที่เปิดโดยเคอร์เนลอาจได้รับการปกป้องจากการเขียนโดยแอปพลิเคชันผู้ใช้ตัวอย่างเช่นอิมเมจระบบไฟล์แบบวนรอบ -หรือการปฏิบัติการที่กำลังดำเนินการในตัวแปรยูนิกซ์บางตัว
ftp
/ ในsftp
สถานการณ์หรือไม่? สมมติว่ากระบวนการเริ่มอ่านftp
ไฟล์ที่ถูกส่งขณะที่ไฟล์เดียวกันเวอร์ชันอื่นกำลังเขียนทับไฟล์นั้นเนื่องจากการส่งใหม่
มันเป็นเงื่อนไขการแข่งขันแบบคลาสสิกดังนั้นผลลัพธ์จึงไม่สามารถคาดการณ์ได้ตามคำจำกัดความ
ในหมู่คนอื่น ๆ มันขึ้นอยู่กับ
fopen(3)
หรือopen(2)
เขียนโหมดหากคุณจำเป็นต้องอ่านไฟล์ในขณะที่กำลังเขียนใหม่คุณสามารถทำให้ผู้เขียนทำสำเนาชั่วคราวของไฟล์แก้ไขไฟล์นั้นจากนั้นคัดลอกกลับไปยังไฟล์ต้นฉบับ นี่เป็นวิธีที่rsync
ทำเช่นนี้ มีหลายวิธีที่จะใช้สิ่งนี้ แต่ไม่มีอาหารกลางวันฟรี แต่ละวิธีมีข้อบกพร่องและผลสะท้อนของตนเอง
ผู้ตอบก่อนหน้านี้มีคำอธิบายที่ครอบคลุมมากกว่านี้ แต่นี่เป็นเคล็ดลับที่ใช้งานได้ดีเช่นกันและทำสิ่งที่เขาต้องการอย่างแท้จริง
$ tail -f <filename>
จะแสดงจุดสิ้นสุดของไฟล์ตามที่เขียน มีประโยชน์ถ้าคุณต้องการไพพ์ STDERR ไปยังไฟล์ แต่ยังคงเห็นมันในหน้าต่างเทอร์มินัลอื่นเช่น