Скачиваний:
56
Добавлен:
08.01.2014
Размер:
2.6 Mб
Скачать

3.2.1. Системный вызов link Описание

uses linux;

Function Link(original_path, New_Path:pathstr):Boolean;

Первый параметр, original_path, является указателем на массив символов, содержащий полное имя файла в системе UNIX. Он должен задавать существующую ссылку на файл, то есть фактическое имя файла. Второй параметр, new_path, задает новое имя файла или ссылку на файл, но файл, заданный параметром new_path, еще не должен существовать.

Системный вызов link возвращает значение true в случае успешного завершения и false – в случае ошибки. В последнем случае новая ссылка на файл не будет создана.

Например, оператор

link('/usr/keith/chap.2', '/usr/ben/2.chap');

создаст новую ссылку /usr/ben/2.chap на существующий файл /usr/keith/chap.2. Теперь к файлу можно будет обратиться, используя любое из имен. Пример показывает, что ссылка не обязательно должна находиться в одном каталоге с файлом, на который она указывает.

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

3.2.3. Системный вызов frename

Фактически задачу предыдущего примера можно выполнить гораздо легче, используя системный вызов frename, который был добавлен в систему UNIX сравнительно недавно. Системный вызов frename может использоваться для переименования как обычных файлов, так и каталогов.

Соседние файлы в папке Полищук, Семериков. Системное программирование в UNIX средствами Free Pascal