» » » Нейл Мэтью - Основы программирования в Linux


Авторские права

Нейл Мэтью - Основы программирования в Linux

Здесь можно скачать бесплатно "Нейл Мэтью - Основы программирования в Linux" в формате fb2, epub, txt, doc, pdf. Жанр: Программное обеспечение, издательство «БХВ-Петербург», год 2009. Так же Вы можете читать книгу онлайн без регистрации и SMS на сайте LibFox.Ru (ЛибФокс) или прочесть описание и ознакомиться с отзывами.
Нейл Мэтью - Основы программирования в Linux
Рейтинг:
Название:
Основы программирования в Linux
Автор:
Издательство:
«БХВ-Петербург»
Год:
2009
ISBN:
978-5-9775-0289-4
Скачать:

99Пожалуйста дождитесь своей очереди, идёт подготовка вашей ссылки для скачивания...

Скачивание начинается... Если скачивание не началось автоматически, пожалуйста нажмите на эту ссылку.

Вы автор?
Жалоба
Все книги на сайте размещаются его пользователями. Приносим свои глубочайшие извинения, если Ваша книга была опубликована без Вашего на то согласия.
Напишите нам, и мы в срочном порядке примем меры.

Как получить книгу?
Оплатили, но не знаете что делать дальше? Инструкция.

Описание книги "Основы программирования в Linux"

Описание и краткое содержание "Основы программирования в Linux" читать бесплатно онлайн.



В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек C/C++ и стан­дартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др. Описана компиляция программ, их компоновка c библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME® и KDE®, хранения данных с использованием СУБД MySQL® и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым.

Для начинающих Linux-программистов






 } else {

  printf("Process %d — unlocked region\n", getpid());

 }

 region_to_lock.l_type = F_UNLCK;

 region_to_lock.l_whence = SEEK_SET;

 region_to_lock.l_start = 0;

 region_to_lock.l_len = 50;

 printf("Process %d, trying F_UNLCK, region %d to %d\n", getpid()", (int)region_to_lock.l_start,

  (int)(region_to_lock.l_start + region_to_lock.l_len));

 res = fcntl(file_desc, F_SETLK, &region_to_lock);

 if (res == -1) {

  printf("Process %d — failed to unlock region\n", getpid());

 } else {

  printf("Process %d — unlocked region\n", getpid());

 }

 region_to_lock.l_type = F_WRLCK;

 region_to_lock.l_whence = SEEK_SET;

 region_to_lock.lstart = 16;

 region_to_lock.l_len = 5;

 printf("Process %d, trying F_WRLCK, region %d to %d\n", getpid(), (int)region_to_lock.l_start,

  (int)(region_to_lock.l_start + region_to_lock.l_len));

 res = fcntl(file_desc, F_SETLK, &region_to_lock);

 if (res == -1) {

  printf("Process %d — failed to lock region\n", getpid());

 } else {

  printf("Process %d — obtained lock on region\n", getpid());

 }

 region_to_lock.l_type = F_RDLCK;

 region_to_lock.l_whence = SEEK_SET;

 region_to_lock.l_start = 40;

 region_to_lock.l_len = 10;

 printf("Process %d, trying F_RDLCK, region %d to %d\n", getpid(), (int)region_to_lock.l_start,

  (int)(region_to_lock.l_start + region_to_lock.l_len));

 res = fcntl(filedesc, F_SETLK, &region_to_lock);

 if (res == -1) {

  printf("Process %d — failed to lock region\n", getpid());

 } else {

  printf("Process %d — obtained lock on region\n", getpid());

 }

 region_to_lock.l_type = F_WRLCK;

 region_to_lock.l_whence = SEEK_SET;

 region_to_lock.l_start = 16;

 region_to_lock. l_len = 5;

 printf("Process %d, trying F_WRLCK with wait, region %d to %d\n", getpid(), (int)region_to_lock.l_start,

  (int)(region_to_lock.l_start + region_to_lock.l_len));

 res = fcntl(file_desc, F_SETLKW, &region_to_lock);

 if (res == -1) {

  printf("Process %d — failed to lock region\n", getpid());

 } else {

  printf("Process %d — obtained lock, on region\n", getpid());

 }

printf ("Process %d ending\n", getpid());

 close(file_desc);

 exit(EXIT_SUCCESS);

}

Если вы сначала запустите программу lock3 в фоновом режиме, далее сразу запускайте новую программу:

$ ./lock3 &

$ process 227 locking file

$ ./lock5

Вы получите следующий вывод:

Process 227 locking file

Process 228, trying F_RDLCK, region 10 to 15

Process 228 — obtained lock on region

Process 228, trying F_UNLCK, region 10 to 15

Process 228 — unlocked region

Process 228, trying F_UNLCK, region 0 to 50

Process 228 — unlocked region

Process 228, trying F_WRLCK, region 16 to 21

Process 228 — failed to lock on region

Process 228, trying F_RDLCK, region 4 0 to 50

Process 228 - failed to lock on region

Process 228, trying F_WRLCK with wait, region 16 to 21

Process 227 closing file

Process 228 — obtained lock on region

Process 228 ending

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

Сначала программа пытается заблокировать участок с 10-го по 15-й байты с помощью разделяемой блокировки. Эта область уже заблокирована блокировкой того же типа, но одновременные разделяемые блокировки допустимы, и установка блокировки завершается успешно.

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

Далее программа пытается заблокировать участок с 16-то по 21-й байты исключительной блокировкой. Эта область уже заблокирована разделяемой блокировкой, поэтому новая попытка блокировки завершается аварийно, т.к. не может быть создана исключительная блокировка. 

После этого программа пробует установить разделяемую блокировку на участок с 40-го по 50-й байты. Эта область уже заблокирована исключительной блокировкой, поэтому данная операция снова завершается аварийно.

В заключение программа опять пытается получить исключительную блокировку для участка с 16-го по 21-й байты, но в этот раз она применяет команду F_SETLKW, позволяющую ждать до тех пор, пока блокировка не будет установлена. В выводе наступает долгая пауза, длящаяся, пока программа lock3, заблокировавшая этот участок, завершает вызов sleep и закрывает файл, тем самым снимая все установленные блокировки. Программа lock5 возобновляет выполнение, успешно блокирует участок файла и затем тоже завершается.

Другие команды блокировок

Есть второй метод блокировки файлов — функция lockf. Она тоже действует, используя дескрипторы файлов.

У функции следующий прототип:

#include <unistd.h>

int lockf(int fildes, int function, off_t size_to_lock);

Параметр function может принимать следующие значения:

□ F_ULOCK — разблокировать;

□ F_LOCK — заблокировать монопольно;

□ F_TLOCK — проверить и заблокировать монопольно;

□ F_TEST — проверить наличие блокировок других процессов.

Параметр size_to_lock содержит количество обрабатываемых байтов, отсчитываемых в файле от текущей величины смещения. У функции lockf более простой интерфейс, чем у вызова fcntl в основном потому, что у нее меньше функциональных возможностей и гибкости. Для применения функции вы должны найти начало участка, который хотите заблокировать, затем вызвать функцию, указав количество блокируемых байтов.

Как и в случае вызова fcntl, все блокировки только рекомендательные; они на самом деле не могут помешать чтению из файла или записи в файл. За проверку имеющихся блокировок отвечают программы. Эффект от смешивания блокировок с помощью fcntl и блокировок с помощью lockf непредсказуем, поэтому вам следует решить, какой способ выбрать, и строго его придерживаться.

Взаимоблокировки

Обсуждение блокировок не было бы законченным без упоминания об опасности взаимоблокировок или тупиков. Предположим, что две программы хотят обновить один и тот же файл. Им обеим нужно обновить байт 1 и байт 2 одновременно. Программа А выбирает первым обновление байта 2, затем байта 1. Программа В пытается обновить сначала байт 1, затем байт 2.

Обе программы стартуют одновременно. Программа А блокирует байт 2, а программа В — байт 1. Программа А пытается установить блокировку для байта 1. Поскольку он уже заблокирован программой В, программа А ждет. Программа В пытается заблокировать байт 2. Поскольку он уже заблокирован программой А, программа В тоже ждет.

Ситуация, в которой ни одна программа не может выполняться, называется взаимоблокировкой или тупиковой ситуацией. Эта проблема очень распространена в работающих с базами данных приложениях, в которых многие пользователи часто пытаются получить доступ к одним и тем же данным. Многие коммерческие реляционные базы данных обнаруживают взаимоблокировки и устраняют их автоматически; ядро Linux этого не делает. Для устранения возникшего непорядка требуется внешнее вмешательство, возможно, принудительно завершающее выполнение одной из программ.

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

Примечание

В этой книге из-за ограниченности объема у нас нет возможности рассматривать трудности действующих одновременно программ. Если вы хотите почитать побольше об этом, попробуйте найти книгу: Ben-Ari М. Principles of Concurrent and Distributed Programming. — Prentice Hall, 1990 (Бен-Ари M. Принципы параллельного и распределенного программирования).

Базы данных

Вы научились использованию файлов для хранения данных, зачем применять для этого базы данных? Очень просто, в некоторых обстоятельствах средства баз данных предоставляют лучший способ решения проблем. Применение базы данных лучше, чем хранение файлов, по двум причинам:

□ вы можете хранить записи данных переменного размера, что довольно трудно реализовать с помощью простых неструктурированных файлов;

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

База данных dbm

Все версии Linux и большая часть вариантов систем UNIX поставляются с базовым, но очень эффективным набором подпрограмм для хранения данных, называемым базой данных dbm. База данных dbm отлично подходит для хранения индексированных данных, которые относительно статичны. Некоторые консерваторы в области баз данных могут возразить, что dbm — вовсе не база данных, а просто система хранения индексных файлов. Стандарт X/Open, тем не менее, называет dbm базой данных, поэтому в книге мы будем продолжать называть ее так же.


На Facebook В Твиттере В Instagram В Одноклассниках Мы Вконтакте
Подписывайтесь на наши страницы в социальных сетях.
Будьте в курсе последних книжных новинок, комментируйте, обсуждайте. Мы ждём Вас!

Похожие книги на "Основы программирования в Linux"

Книги похожие на "Основы программирования в Linux" читать онлайн или скачать бесплатно полные версии.


Понравилась книга? Оставьте Ваш комментарий, поделитесь впечатлениями или расскажите друзьям

Все книги автора Нейл Мэтью

Нейл Мэтью - все книги автора в одном месте на сайте онлайн библиотеки LibFox.

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Отзывы о "Нейл Мэтью - Основы программирования в Linux"

Отзывы читателей о книге "Основы программирования в Linux", комментарии и мнения людей о произведении.

А что Вы думаете о книге? Оставьте Ваш отзыв.