Читаем Linux API. Исчерпывающее руководство полностью

Программа в листинге 18.1 демонстрирует, что, даже когда удалена последняя ссылка на файл, сам он удаляется только после закрытия всех файловых дескрипторов, соотнесенных с ним.


Листинг 18.1. Удаление ссылки с помощью системного вызова unlink()

dirs_links/t_unlink.c

#include

#include

#include "tlpi_hdr.h"


#define CMD_SIZE 200

#define BUF_SIZE 1024


int

main(int argc, char *argv[])

{

int fd, j, numBlocks;

char shellCmd[CMD_SIZE]; /* Команда, передаваемая вызову system() */

char buf[BUF_SIZE]; /* Случайные байты для записи в файл */


if (argc < 2 || strcmp(argv[1], "-help") == 0)

usageErr("%s temp-file [num-1kB-blocks] \n", argv[0]);

numBlocks = (argc > 2)? getInt(argv[2], GN_GT_0, "num-1kB-blocks")

: 100000;


fd = open(argv[1], O_WRONLY | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);

if (fd == -1)

errExit("open");


if (unlink(argv[1]) == -1) /* Удаляем имя файла */

errExit("unlink");


for (j = 0; j < numBlocks; j++) /* Заполняем файл мусором */

if (write(fd, buf, BUF_SIZE)!= BUF_SIZE)

fatal("partial/failed write");


snprintf(shellCmd, CMD_SIZE, "df — k `dirname %s`", argv[1]);

system(shellCmd); /* Просмотр пространства,

занятого в файловой системе */


if (close(fd) == -1) /* Теперь файл удален */

errExit("close");

printf("********** Closed file descriptor\n");


system(shellCmd); /* Повторный просмотр пространства,

занятого в файловой системе */

exit(EXIT_SUCCESS);

}

dirs_links/t_unlink.c

Программа в листинге 18.1 принимает через командную строку два аргумента. Первый идентифицирует имя файла, который следует создать. Программа открывает этот файл, а затем немедленно разрывает связь с его именем. И хотя оно пропадает, сам файл продолжает существовать. Затем программа записывает произвольные блоки данных в этот файл. Количество их указано в необязательном втором аргументе командной строки. Здесь программа применяет команду df(1) для отображения величины занятого пространства в файловой системе.

Затем программа закрывает файловый дескриптор, и в этот момент происходит удаление файла. Далее она еще раз применяет команду df(1), чтобы показать уменьшение величины использованного дискового пространства. Следующий сеанс работы в оболочке демонстрирует применение программы из листинга 18.1:

$ ./t_unlink /tmp/tfile 1000000

Filesystem 1K-blocks Used Available Use% Mounted on

/dev/sda10 5245020 3204044 2040976 62 % /

********** Closed file descriptor

Filesystem 1K-blocks Used Available Use% Mounted on

/dev/sda10 5245020 2201128 3043892 42 % /

В листинге 18.1 задействована функция system() для выполнения команды оболочки. Мы подробно опишем эту функцию в разделе 27.6.


18.4. Изменение имени файла: системный вызов rename()


Системный вызов rename() можно использовать как для переименования файла, так и для его перемещения в другой каталог той же файловой системы.

#include


int rename(const char *oldpath, const char *newpath);

Возвращает 0 при успешном завершении или –1 при ошибке

Аргумент oldpath — существующее имя пути, которое будет переименовано на указанное в аргументе newpath.

Системный вызов rename() оперирует записями каталога; он не перемещает данные файла. Переименование не отражается на других жестких ссылках, связанных с этим файлом, оно не влияет также ни на какие процессы, удерживающие открытыми дескрипторы для данного файла, поскольку такие дескрипторы соотносятся с открытыми файловыми дескрипторами, которые (после вызова open()) не связаны с именами файлов.

С применением системного вызова rename() связаны следующие правила.

• Если файл по адресу newpath уже существует, то перезаписывается.

• Если аргументы newpath и oldpath ссылаются на один и тот же файл, то никаких изменений не производится (и вызов завершается успешно). Данное правило противоречит здравому смыслу. Если отталкиваться от предыдущего пункта, то можно было бы ожидать, что при наличии двух имен файлов x и y системный вызов rename("x", "y") удалил бы имя x. Но это не так, если x и y являются ссылками на один и тот же файл.

Разумным объяснением этого правила, восходящим к реализации BSD, является, вероятно, желание упростить проверки, которые должно было выполнять ядро, чтобы такие системные вызовы, как rename("x", "x"), rename("x", "./x") и rename("x", "somedir/../x"), не удаляли файл.

• Системный вызов rename() не разыменовывает символические ссылки в обоих аргументах. Если аргумент oldpath является символической ссылкой, она переименовывается. Если аргумент newpath является символической ссылкой, то она обрабатывается как обычное имя пути, на которое следует переименовать имя oldpath (то есть существующая символическая ссылка newpath удаляется).

Перейти на страницу:

Похожие книги

C++ Primer Plus
C++ Primer Plus

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

Программирование, программы, базы данных
1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
C# 4.0: полное руководство
C# 4.0: полное руководство

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

Программирование, программы, базы данных