Что происходит, когда я убиваю «CP»? Это безопасно и имеет ли у него какие-либо последствия?

Для этого тестового файла:

$ cat path
/path/to/file
/tmp
/foo/bar/.config/wizard_magic

Сокращения могут быть сгенерированы с этим кодом awk:

$ awk -F/ '{for (i=1;i<NF;i++) $i=substr($i,1,1)} 1' OFS=/ path
/p/t/file
/tmp
/f/b/./wizard_magic

Edit1: Использование двух символов для имен точек

Эта версия сокращает имена каталогов до одного символа, за исключением имен, начинающихся с . , которые сокращаются до двух символов:

$ awk -F/ '{for (i=1;i<NF;i++) $i=substr($i,1,1+($i~/^[.]/))} 1' OFS=/ path
/p/t/file
/tmp
/f/b/.c/wizard_magic

Как это работает

  • -F /

    Указывает awk использовать косую черту в качестве разделителя полей при вводе.

  • for (i = 1; i

    Это перебирает каждое поле, кроме последнего, и заменяет его только первым символом.

    РЕДАКТИРОВАТЬ1: В исправленной версии мы делаем длину подстроки 2, когда поле начинается с . .

  • 1

    Указывает awk напечатать исправленную строку.

  • OFS = /

    Указывает awk использовать косую черту в качестве разделителя полей при выводе.

23
04.09.2018, 15:43
2 ответа

Это безопасно, но, естественно, вы можете не закончить копию.

При запуске команды cpвыполняются системные вызовы, которые предписывают ядру сделать копии файла. Системный вызов или системный вызов — это функция, которую приложение может использовать для запроса службы от ядра, например чтения или записи данных на диск. Процесс пользовательского пространства просто ждет завершения системного вызова. Если бы вы проследили звонки с cp ~/hello.txt /mnt, это выглядело бы как:

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

Это повторяется для каждого копируемого файла. Из-за того, как работают эти системные вызовы, повреждения не произойдет. При вводе системных вызовов, подобных этим, фатальный сигнал вступит в силу только после завершения системного вызова , а не во время его выполнения (. На самом деле сигналы поступают только во время переключения контекста из пространства ядра в пространство пользователя ).. Обратите внимание, что некоторые сигналы, такие как read(), могут прерываться досрочно.

Из-за этого принудительное завершение процесса приведет к его завершению только после возврата текущего системного вызова. Это означает, что ядро, в котором находится драйвер файловой системы, может завершить операции, необходимые для приведения файловой системы в нормальное состояние. Любой ввод-вывод такого рода никогда не будет прерван в середине операции, поэтому риск повреждения файловой системы отсутствует.

25
27.01.2020, 19:41

Поскольку cpявляется командой пользовательского пространства, это не влияет на целостность файловой системы.

Вы, конечно, должны быть готовы к тому, что хотя бы один файл не будет скопирован полностью, если вы убьете работающую cpпрограмму.

23
27.01.2020, 19:41

Теги

Похожие вопросы