Системное программирование в UNIX средствами Free Pascal

       

Системный вызов 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.



Содержание раздела