วิธีนี้ปลอดภัยที่จะทำ แต่โดยธรรมชาติคุณอาจยังทำสำเนาไม่เสร็จ
เมื่อcp
คำสั่งถูกเรียกใช้มันจะสร้าง syscalls ที่สั่งให้เคอร์เนลทำสำเนาไฟล์ syscall เป็นฟังก์ชันที่แอปพลิเคชันสามารถเรียกใช้ที่ร้องขอบริการจากเคอร์เนลเช่นการอ่านหรือการเขียนข้อมูลไปยังดิสก์ กระบวนการ userspace นั้นรอให้ syscall เสร็จสิ้น หากคุณต้องติดตามการโทรมันจะมีลักษณะดังนี้:
open("/home/user/hello.txt", O_RDONLY) = 3
open("/mnt/hello.txt", O_CREAT|O_WRONLY, 0644) = 4
read(3, "Hello, world!\n", 131072) = 14
write(4, "Hello, world!\n", 14) = 14
close(3) = 0
close(4) = 0
การทำซ้ำนี้สำหรับแต่ละไฟล์ที่จะคัดลอก จะไม่มีความเสียหายเกิดขึ้นเนื่องจากวิธีการทำงานของ syscalls เหล่านี้ เมื่อป้อน syscalls เช่นนี้สัญญาณร้ายแรงจะมีผลเฉพาะหลังจากที่ syscall เสร็จสิ้นไม่ใช่ในขณะที่กำลังทำงาน ด้วยเหตุนี้การบังคับให้ฆ่ากระบวนการจะทำให้ยุติลงหลังจาก syscall ที่รันอยู่ในปัจจุบันเสร็จสิ้นแล้วเท่านั้น ซึ่งหมายความว่าเคอร์เนลซึ่งไดรเวอร์ระบบไฟล์ใช้งานได้ฟรีเพื่อให้การดำเนินการเสร็จสิ้นตามที่ต้องการเพื่อทำให้ระบบไฟล์เข้าสู่สถานะมีสติ I / O ชนิดนี้จะไม่ถูกยกเลิกในช่วงกลางของการดำเนินการทำให้พวกเขาดำเนินการปรมาณู
น่าสนใจนี่คือเหตุผลว่าทำไมคำสั่งเช่นcp
นี้อาจไม่ยุติทันทีเมื่อถูกฆ่า หากคุณกำลังคัดลอกไฟล์ที่มีขนาดใหญ่มากและฆ่ามันแม้จะมี SIGKILL กระบวนการก็จะยังคงทำงานจนกว่า syscall ปัจจุบันจะเสร็จสิ้น ด้วยไฟล์ขนาดใหญ่อาจใช้เวลาสักครู่เนื่องจากกระบวนการจะอยู่ในสถานะไม่หยุดชะงัก