Linux ทำอะไรที่แตกต่างกันซึ่งทำให้ฉันสามารถลบ / แทนที่ไฟล์ที่ Windows จะบ่นว่าไฟล์นั้นถูกใช้งานอยู่ในปัจจุบัน?


29

ตัวอย่างที่ฉันมีคือ Minecraft เมื่อรัน Bukkit บน Linux ฉันสามารถลบหรืออัปเดตไฟล์. jar ในโฟลเดอร์ / plugins และเพียงแค่เรียกใช้คำสั่ง 'reload'

ใน Windows ฉันต้องใช้กระบวนการเซิร์ฟเวอร์ทั้งหมดเพราะจะบ่นว่าขณะนี้ไฟล์. jar กำลังใช้งานอยู่เมื่อฉันพยายามลบหรือแทนที่

มันยอดเยี่ยมสำหรับฉัน แต่ทำไมมันเกิดขึ้น Linux ทำอะไรที่นี่แตกต่างกันอย่างไร

คำตอบ:


34

ลีนุกซ์ลบไฟล์ต่างจากที่ Windows ทำ ขั้นแรกให้คำอธิบายสั้น ๆ เกี่ยวกับวิธีจัดการไฟล์ในระบบไฟล์เนทีฟ * unix

i-nodeไฟล์จะถูกเก็บไว้บนดิสก์ในโครงสร้างหลายระดับที่เรียกว่า i-node แต่ละตัวมีหมายเลขเฉพาะบนระบบไฟล์เดียว โครงสร้าง I-โหนดเก็บข้อมูลที่แตกต่างกันเกี่ยวกับไฟล์เช่นขนาดบล็อกข้อมูลที่จัดสรรสำหรับไฟล์ ฯลฯ link counterแต่เพื่อประโยชน์ของคำตอบนี้มากที่สุดองค์ประกอบของข้อมูลที่สำคัญคือ directoriesเป็นไฟล์ที่เก็บบันทึกเกี่ยวกับไฟล์ แต่ละเร็กคอร์ดมีหมายเลข i-node ที่อ้างถึงความยาวชื่อไฟล์และชื่อไฟล์เอง ชุดรูปแบบนี้อนุญาตให้มี 'พอยน์เตอร์' คือ 'ลิงก์' ไปยังไฟล์เดียวกันในสถานที่ต่าง ๆ ที่มีชื่อแตกต่างกัน ตัวนับลิงก์ของ i-node เก็บจำนวนลิงก์ที่อ้างถึง i-node นี้จริง ๆ

จะเกิดอะไรขึ้นเมื่อบางกระบวนการเปิดไฟล์? ก่อนอื่นopen()ฟังก์ชันจะค้นหาเรคคอร์ดไฟล์ จากนั้นตรวจสอบว่าโครงสร้าง i-node ในหน่วยความจำสำหรับ i-node นี้มีอยู่แล้ว สิ่งนี้อาจเกิดขึ้นหากบางแอปพลิเคชันเปิดไฟล์นี้อยู่แล้ว มิฉะนั้นระบบจะเริ่มต้นโครงสร้าง i-node ใหม่ในหน่วยความจำ จากนั้นระบบจะเพิ่มโครงสร้างตัวนับ i-node ในหน่วยความจำที่เปิดอยู่และกลับสู่แอปพลิเคชันของตัวอธิบายไฟล์

โทรห้องสมุด Linux unlinkเพื่อลบไฟล์ที่เรียกว่า ฟังก์ชันนี้ลบเร็กคอร์ดไฟล์ออกจากไดเร็กทอรีและลดตัวนับลิงก์ของ i-node หากระบบพบว่ามีโครงสร้าง i-node ในหน่วยความจำอยู่และตัวนับ open ไม่เป็นศูนย์การเรียกนี้จะส่งคืนการควบคุมไปยังแอปพลิเคชัน มิฉะนั้นจะตรวจสอบว่าลิงก์ตัวนับกลายเป็นศูนย์หรือไม่และถ้าเป็นเช่นนั้นระบบจะปล่อยบล็อกทั้งหมดที่จัดสรรสำหรับ i-node และ i-node นั้นเองและกลับสู่แอปพลิเคชัน

เกิดอะไรขึ้นเมื่อแอปพลิเคชันปิดไฟล์ ฟังก์ชั่นclose()ลดเคาน์เตอร์เปิดและตรวจสอบค่าของมัน หากค่าไม่ใช่ศูนย์ฟังก์ชันจะกลับไปที่แอปพลิเคชัน มิฉะนั้นจะตรวจสอบว่าตัวนับลิงก์ i-node เป็นศูนย์หรือไม่ หากเป็นศูนย์จะปล่อยบล็อกทั้งหมดของไฟล์และ i-node ก่อนที่จะกลับไปที่แอ็พพลิเคชัน

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

ยิ่งไปกว่านั้นคุณสมบัตินี้ช่วยให้คุณอัปเดต glibc (libc) - ไลบรารีหลักของแอปพลิเคชันทั้งหมด - ในระบบของคุณโดยไม่รบกวนการทำงานปกติ

ของ windows

20 ปีที่แล้วเราไม่ทราบว่าระบบไฟล์อื่น ๆ ของ FAT ภายใต้ระบบดอส ระบบไฟล์นี้มีโครงสร้างและหลักการจัดการที่แตกต่างกัน หลักการเหล่านี้ไม่อนุญาตให้คุณลบไฟล์เมื่อมีการเปิดดังนั้น DOS และเมื่อเร็ว ๆ นี้ Windows ต้องปฏิเสธคำขอลบใด ๆ ในไฟล์ที่เปิดอยู่ อาจเป็น NTFS จะอนุญาตให้มีพฤติกรรมเช่นเดียวกับระบบไฟล์ * nix แต่ Microsoft ตัดสินใจที่จะรักษาพฤติกรรมการลบไฟล์

นี่คือคำตอบ ไม่สั้น แต่ตอนนี้คุณมีความคิด

แก้ไข : อ่านแหล่งที่มาของความWin32ยุ่งเหยิงได้ดี: https://blogs.msdn.microsoft.com/oldnewthing/20040607-00/?p=38993 เครดิตไปที่ @ จอน


1
พยายามเปลี่ยนชื่อไฟล์ปลั๊กอินขณะที่เซิร์ฟเวอร์กำลังทำงาน: i.imgur.com/xibyF.png
MetaGuru

เปิดหน้าต่าง cmd เปลี่ยนเป็นไดเรกทอรีนี้และใช้งานren MonsterB.jar MonsterB.ja_- ควรใช้งานได้ มันทำงานได้กับไฟล์ dll และ exe อย่างแน่นอน
Serge

1
ไม่ Windows จะแม็พไฟล์ส่วนที่เรียกใช้งานลงในหน่วยความจำ
Serge

9
NTFS รองรับจริง ๆ แต่fopenคำสั่งC Library เรียกCreateFileด้วยFILE_SHARE_DELETEแฟล็กดังนั้นจึงไม่อนุญาตสำหรับโปรแกรมส่วนใหญ่ที่เปิดไฟล์
Random832

2
หน้าที่ลิงก์ Raymond Chen: blogs.msdn.microsoft.com/oldnewthing/20040607-00/?p=38993
จอน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.