Questo è sicuro, ma potresti non aver finito la copia.
Quando cp
viene eseguito il comando, crea syscalls che indica al kernel di creare copie del file. Una syscall è una funzione che un'applicazione può chiamare che richiede un servizio dal kernel, come leggere o scrivere dati sul disco. Il processo userspace attende semplicemente che la syscall finisca. Se dovessi rintracciare le chiamate, sarebbe simile a:
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
Questo si ripete per ogni file che deve essere copiato. Nessuna corruzione si verificherà a causa del modo in cui funzionano queste syscalls. Quando vengono immesse syscall come queste, il segnale fatale avrà effetto solo dopo che la syscall è terminata , non mentre è in esecuzione. Per questo motivo, l'uccisione forzata del processo comporterà la sua conclusione solo al termine della syscall attualmente in esecuzione. Ciò significa che il kernel, dove vive il driver del filesystem, è libero di completare le operazioni che deve completare per mettere il filesystem in uno stato sano. Qualsiasi I / O di questo tipo non verrà mai terminato durante l'operazione, rendendoli operazioni atomiche.
È interessante notare che questo è il motivo per cui comandi come cp
potrebbero non terminare immediatamente quando vengono uccisi. Se stai copiando un file molto grande e lo uccidi, anche con SIGKILL, il processo continuerà fino al termine dell'attuale syscall. Con un file di grandi dimensioni, ciò potrebbe richiedere del tempo, poiché il processo sarà ininterrotto.