Системный вызов unlink
В разделе 2.1.13 мы представили системный вызов unlink в качестве простого способа удаления файла из системы. Например:
unlink('/tmp/scratch');
удалит файл /tmp/scratch.
Фактически системный вызов unlink просто удаляет указанную ссылку и уменьшает счетчик ссылок (link count) файла на единицу. Данные в файле будут безвозвратно потеряны только после того, как счетчик ссылок на него станет равным нулю, и он не будет открыт ни в одной программе. В этом случае занятые файлом блоки на диске добавляются к поддерживаемому системой списку свободных блоков. Хотя данные могут еще существовать физически в течение какого-то времени, восстановить их будет невозможно. Так как многие файлы иметь лишь одну ссылку – принятое имя файла, удаление файла является обычным результатом вызова unlink. И наоборот, если счетчик ссылок не уменьшится до нуля, то данные в файле останутся нетронутыми, и к ним можно будет обратиться при помощи других ссылок на файл.
Следующая короткая программа переименовывает файл, вначале создавая на него ссылку с новым именем и удаляя в случае успеха старую ссылку на файл. Это упрощенная версия стандартной команды UNIX mv:
(* Программа move - переименование файла *)
uses linux,stdio;
const
usage = 'Применение: move файл1 файл2';
(*
* Программа использует аргументы командной строки,
* передаваемые обычным способом.
*)
begin
if (paramcount <> 2) then
begin
writeln(stderr, usage);
halt(1);
end;
if not link(paramstr(1), paramstr(2)) then
begin
perror('Ошибка в вызове link');
halt(1);
end;
if not unlink (argv[1]) then
begin
perror('Ошибка в вызове unlink');
unlink(paramstr(2));
halt(1);
end;
writeln('Успешное завершение');
halt(0);
end.
До сих пор не было упомянуто взаимодействие вызова unlink и прав доступа к файлу, связанных с аргументом, задающим имя файла. Это объясняется тем, что права просто не влияют на вызов unlink. Вместо этого успешное или неуспешное завершение вызова unlink определяется правами доступа к содержащему файл каталогу. Эту тема будет рассмотрена в главе 4.