Jest to bezpieczne, ale oczywiście możesz nie ukończyć kopiowania.
Po uruchomieniu cp
polecenia wywołuje syscall, które instruują jądro, aby tworzyło kopie pliku. Syscall to funkcja, którą może wywołać aplikacja, która żąda usługi z jądra, takiej jak odczyt lub zapis danych na dysk. Proces przestrzeni użytkownika po prostu czeka na zakończenie syscall. Gdybyś śledził połączenia, wyglądałoby to tak:
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
Powtarza się to dla każdego pliku, który ma zostać skopiowany. Z powodu sposobu działania tych połączeń systemowych nie nastąpi uszkodzenie. Kiedy syscalli takie jak te są wprowadzane, sygnał śmiertelny zajmie tylko efekt po syscall została zakończona , nie jest uruchomiona. Z tego powodu wymuszone zabicie procesu spowoduje jego zakończenie dopiero po zakończeniu aktualnie działającego syscall. Oznacza to, że jądro, w którym znajduje się sterownik systemu plików, może zakończyć operacje, które musi wykonać, aby wprowadzić system plików w normalny stan. Wszelkie tego rodzaju operacje we / wy nigdy nie zostaną zakończone w trakcie operacji, co czyni je operacjami atomowymi.
Co ciekawe, dlatego takie polecenia cp
mogą nie kończyć się natychmiast po ich zabiciu. Jeśli kopiujesz bardzo duży plik i go zabijesz, nawet przy użyciu SIGKILL, proces będzie nadal działał, aż do zakończenia bieżącego połączenia systemowego. W przypadku dużego pliku może to chwilę potrwać, ponieważ proces będzie w stanie nieprzerwanym.