Читаем Основы программирования в Linux полностью

Для создания файла с блокировкой (упражнение 7.7) можно использовать системный вызов open, определенный в файле fcntl.h (уже встречавшемся в предыдущих главах) и содержащий набор флагов O_CREAT и O_EXCL. Этот способ позволяет проверить, не существует ли уже такой файл, и затем создать его за одну элементарную неделимую операцию.

Упражнение 7.7. Создание файла с блокировкой

В программе lock1.c вы сможете увидеть файл с блокировкой в действии.

#include 

#include 

#include 

#include 

#include 

int main() {

 int file_desc;

 int save_errno;

 file_desc = open("/tmp/LCK.test", O_RDWR | O_CREAT | O_EXCL, 0444);

 if (file_desc == -1) {

  save errno = errno;

  printf("Open failed with error %d\n", save_errno);

 } else {

  printf("Open succeeded\n");

 }

 exit(EXIT_SUCCESS);

} 

Выполнив программу первый раз, вы получите следующий вывод:

./lock1

Open succeeded

Но при повторной попытке вы получите результат, приведенный далее:

$ ./lock1

Open failed with error 17

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

Для создания файла с именем /tmp/LCK.test программа выполняет вызов, использующий флаги O_CREAT и O_EXCL. Во время первого выполнения программы файл не существует, поэтому вызов open завершается успешно. Последующие запуски программы завершаются аварийно, потому что файл уже существует. Для успешного выполнения этой программы в дальнейшем вы должны вручную удалить файл с блокировкой.

В системах Linux, ошибка 17 соответствует константе EEXIST, указывающей на то, что файл уже существует. Номера ошибок определены в файле errno.h или, скорее, в файлах, включаемых этим файлом. В данном случае определение в действительности, находящееся в /usr/include/asm-generic/errno-base.h, гласит

#define EEXIST 17 /* File exists */

Это ошибка, соответствующая аварийному завершению вызова open(O_CREAT | O_EXCL).

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

Вы можете увидеть сотрудничество программ, применяющих этот механизм блокировки, написав программу-пример и запустив одновременно две ее копии (упражнение 7.8). В программе будет использован вызов функции getpid, с которой вы встречались в главе 4, она возвращает идентификатор процесса, уникальный номер для каждой выполняющейся в данный момент программы.

Упражнение 7.8. Совместная блокировка файлов

1. Далее приведен исходный код тестовой программы lock2.с.

#include

#include  

#include

#include

#include

const char *lock_file = "/tmp/LCK.test2";

int main() {

 int file_desc;

 int tries = 10;

 while (--tries) {

  file_desc = open(lock_file, O_RDWR | O_CREAT | O_EXCL, 0444);

  if (file_desc == -1) {

   printf("%d - Lock already present\n", getpid());

   sleep(3);

  } else {

2. Далее следует критическая секция:

   printf("%d — I have exclusive access\n", getpid());

   sleep(1);

   (void)close(file_desc);

   (void)unlink(lockfile);

3. В этом месте она заканчивается:

   sleep(2);

  }

 }

 exit(EXIT_SUCCESS);

}

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

$ rm -f /tmp/LCK.test2

Затем с помощью приведенной далее команды запустите две копии программы:

$ ./lock2 & ./lock2

Она запускает одну копию программы в фоновом режиме, а вторую — как основную программу. Далее приведен вывод:

1284 — I have exclusive access

1283 — Lock already present

1283 — I have exclusive access

1284 — Lock already present

1284 — I have exclusive access

1283 — Lock already present

1283 — I have exclusive access

1284 — Lock already present

1284 — I have exclusive access

1283 — Lock already present

1283 — I have exclusive access

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

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

Полное руководство по Microsoft Windows XP
Полное руководство по Microsoft Windows XP

В книге известного американского автора описывается среда ОС Windows XP и принципы ее функционирования, приведен сравнительный анализ Windows XP с предшествующими версиями операционной системы Windows. Рассматриваются вопросы применения и модификации нового интерфейса с целью получения прямого доступа ко всем функциям Windows XP обсуждаются варианты подключения к компьютерным сетям. Несколько разделов посвящены работе с реестром и конфигурационными файлами, мультимедийным функциям и разнообразным системным службам, а также методам решения проблем с программным обеспечением и оборудованием. Особое внимание уделено обеспечению безопасности операционной системы.Издание адресовано пользователям и сетевым администраторам, желающим активно применять возможности операционной системы Windows XP (в том числе и недокументированные).

Джон Поль Мюллер , Питер Нортон

ОС и Сети / Книги по IT
Сетевые средства Linux
Сетевые средства Linux

В этой книге описаны принципы действия и область применения многих серверов, выполняющихся в системе Linux. Здесь рассматриваются DHCP-сервер, серверы Samba и NFS, серверы печати, NTP-сервер, средства удаленной регистрации и система X Window. He забыты и средства, традиционно используемые для обеспечения работы Internet-служб: серверы DNS, SMTP, HTTP и FTP. Большое внимание уделено вопросам безопасности сети. В данной книге нашли отражения также средства удаленного администрирования — инструменты Linuxconf, Webmin и SWAT.Данная книга несомненно окажется полезной как начинающим, так и опытным системным администраторам.Отзывы о книге Сетевые средства LinuxПоявилась прекрасная книга по Linux, осталось воспользоваться ею. Не упустите свой шанс.Александр Стенцин, Help Net Security, www.net-security.orgЕсли вы стремитесь в полной мере использовать сетевые возможности Linux — эта книга для вас. Я настоятельно рекомендую прочитать ее.Майкл Дж. Джордан, Linux OnlineВыхода подобной книги давно ожидали читатели. Менее чем на 700 страницах автор смог изложить суть самых различных вопросов, связанных с работой Linux. Автор является высококвалифицированным специалистом в своей области и щедро делится своими знаниями с читателями.Роджер Бертон, West, DiverseBooks.com

Родерик В. Смит

ОС и Сети, интернет / ОС и Сети / Книги по IT