Dies ist sicher, aber natürlich haben Sie die Kopie möglicherweise noch nicht fertiggestellt.
Wenn der cp
Befehl ausgeführt wird, werden Systemaufrufe ausgeführt, die den Kernel anweisen, Kopien der Datei zu erstellen. Ein Syscall ist eine Funktion, die eine Anwendung aufrufen kann, um einen Dienst vom Kernel anzufordern, z. B. das Lesen oder Schreiben von Daten auf die Festplatte. Der Userspace-Prozess wartet einfach darauf, dass der Syscall beendet wird. Wenn Sie die Anrufe verfolgen würden, würde dies ungefähr so aussehen:
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
Dies wird für jede zu kopierende Datei wiederholt. Aufgrund der Funktionsweise dieser Systemaufrufe tritt keine Beschädigung auf. Wenn syscalls wie diese eingegeben werden, wird das fatale Signal erst wirksam, nachdem der syscall hat fertig , nicht während des Betriebs. Aus diesem Grund wird das gewaltsame Beenden des Prozesses erst beendet, nachdem der derzeit ausgeführte Systemaufruf beendet wurde. Dies bedeutet, dass der Kernel, in dem sich der Dateisystemtreiber befindet, die Vorgänge ausführen kann, die erforderlich sind, um das Dateisystem in einen vernünftigen Zustand zu versetzen. Solche E / A-Vorgänge werden niemals mitten in der Operation beendet, was sie zu atomaren Operationen macht.
Interessanterweise werden Befehle wie cp
nicht sofort beendet, wenn sie getötet werden. Wenn Sie eine sehr große Datei kopieren und sie auch mit SIGKILL beenden, wird der Prozess weiterhin ausgeführt, bis der aktuelle Systemaufruf abgeschlossen ist. Bei einer großen Datei kann dies eine Weile dauern, da sich der Prozess in einem unterbrechungsfreien Zustand befindet.