Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Цуканов Б.И. "Время в психике человека" (Медицина)

Суворов С. "Танк Т-64. Первенец танков 2-го поколения " (Военная промышленность)

Нестеров В.А. "Основы проэктирования ракет класса воздух- воздух и авиационных катапульных установок для них" (Военная промышленность)

Фогль Б. "101 вопрос, который задала бы ваша кошка своему ветеринару если бы умела говорить" (Ветеринария)

Яблоков Н.П. "Криминалистика" (Юриспруденция)
Реклама

Программирование для Linux. Профессиональный подход - Митчелл М.

Митчелл М., Оулдем Дж., Самьюал А. Программирование для Linux. Профессиональный подход — М.: Вильямс , 2003. — 288 c.
ISBN 5-8459-0243-6
Скачать (прямая ссылка): programmirovaniedlyalinux2003.djvu
Предыдущая << 1 .. 67 68 69 70 71 72 < 73 > 74 75 76 77 78 79 .. 128 >> Следующая

структуру типа flock. В поле l_type должна быть записана константа
F_RDLCK в случае блокировки чтения н константа FJWRLCK - в случае
блокировки записи. Далее следует вызвать функцию fcntl (), передав ей
дсскршггор файла, код операции F SETLCKW и указатель на структуру типа
flock. Если аналогичная блокировка уже была поставлена другим процессом,
функия rent 1 () перейдет в режим ожидания, пока "мешающая" ей блокировка
не б>дет снята.
В листинге 8.2 показана программа, которая открывает для записи указанный
файл, а затем ставит на него бчокировку записи. Программа ждет нажатия
клавиши <Enter>, после чего снимает блокировку и закрывает файл.
1истинг 8.2. (lock-Jile.c) Установка блокировки записи с помощью функция
fcntl ()
tinclude <fcntl.h>
#include <stdio-h>
#include <strrng.h> tinclude <unistd.h>
mt main (int argc, char* argv{))
{
char* file = argv[l); int fd;
struct flock lock;
printf ("opening %s\n", file);
/* Открытие файла. */
fd = open (file, o_WRONLY);
printf ("locking\n"};
/* Инициализация структуры flock. */ memset (block, 0, sizeof(lock)J;
lock.l_type = F_WRLCK;
/* Установка блокировки записи. */ fcntl (fd, F_SETLKW, block);
printf ("locked; hit Enter to unlock... /* Ожидание нажатия клавиши
<Enter>. */ getchar ();
printf ("unlocking\n");
/* Снятие блокировки. */ lock.l_type = F_UNLCK; fcntl (fd, F_SETLKW,
&lock);
close (fd); return 0;
}
Скомпилируйте программу н запустите се с каким-нибудь тестовым файлом,
скажем, /tmp/test-file:
% сс -о lock-file lock-file.c % touch /tmp/test-file % ./lock-file
/tmp/test-file opening /tmp/test-file locking
locked; hit Enter to unlock...
Теперь откройте другое окно и вызовите программу еще раз с тем же файлом:
% ./lock-file /tmp/test-file opening /tmp/test-file locking
Глава 8 Системные вызовы Linux 157
Пытаясь поставить блокировку на файл, программа сама окажется
заблокированной. Вернитесь в первое окно и нажмите <Enter>:
unlocking
В результате программа, запущенная во втором окне, немедленно продолжит
свою работу. Если необходимо, чтобы функция f cntl () не переходила в
режим ожидания в случае. ко1 да блокировку' поставить невозможно, задайте
в качестве кода операции константу F_SETLCK, а не F_SETLCKW. Если функция
обнаружит, что запрашиваемый файл уже заблокирован, она немедленно вернет
-1.
В 1 inux имеется системный вызов flock (), также реализующий операцию
блокирования файла. Но у функции f cntl () есть большое преимущество: она
работает с файловыми системами NFS' (прн условии, что сервер NFS имеет
относительно недавнюю версию и сконфигурирован правильно). Так что, имея
доступ к двум компьютерам, которые монтируют одну и ту же файловую
систему через NFS, можно повторить показанный выше пример на двух разных
машинах.
8.4. Функции fsync() и fdatasync(): очистка дисковых буферов
В большинстве операционных систем при записи в файл данные не передаются
на диск немедленно. Вместо этого операционная система помещает их в
резидентный кэш*буфер с целью сокращения числа обращений к диску и
повышения оперативности программы. Когда буфер заполнится или произойдет
какое-нибудь другое событие (иапример. истечет определенный промежуток
времени), система запишет содержимое буфера на диск в ходе одной
непрерывной операции.
В I mux тоже поддерживается такой тип кэширования. Обычно он способствует
существенному повышению производительности. Но он же делает ненадежными
программы, зависящие от целостности дисковых данных. Если система
внезапно выйдет из строя, на-пример вследствие сбоя ядра или отключения
питания, любые данные, находящиеся в па-ми i и и еще не записанные на
диск, будут потеряны.
Предположим, создается программа обработки транзакций, которая ведет
журнальный файл. В этот файл помещаются записи обо всех транзакциях,
завершившихся на данный момент, чтобы в случае системного сбоя можно было
восстановить целостность данных. Очевидно, не менее важна и целостность
самого журнального файла: как только транзакция завершена, запись о ней
должна быть немедленно занесена в дисковый файл.
Для реализации такого поведения ОС Linux предоставляет системный вызов f
sync [). Эта функция принимает один аргумент - дескртггор записываемого
файла - и принудительно переносит на диск все данные этого файла,
находящиеся в кэш-буфере. Функция не завершается до тех пор, пока данные
не окажутся на диске.
В листинге 8.3 показана функция, использующая данный системный вызов. Она
записывает переданную ей строку в журнальный файл.
Листинг 8.3. [iurite_joumal_enhy.c) Запись строки в журнальный файл с
последующей синхронизацией
#include <fcnt1.h>
#include <string.h>
#include <sys/scat-h>
^include <sys/typeB.h>
#include <uniscd-h>
3 SFS (Network FileSvstem) - популярная технология совместного
использования файлов в сети.
158 Часть II. Секреты Linux
const char* journal_filename = "journal.log";
void write, journal entry (char* entry)
(
int fd = Open (jouraal"filename, Q_WRONLY | 0_CREAT | 0_APPEND, 0660J;
Предыдущая << 1 .. 67 68 69 70 71 72 < 73 > 74 75 76 77 78 79 .. 128 >> Следующая