Нейл Мэтью - Основы программирования в Linux
- Название:Основы программирования в Linux
- Автор:
- Жанр:
- Издательство:«БХВ-Петербург»
- Год:2009
- Город:Санкт-Петербург
- ISBN:978-5-9775-0289-4
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Нейл Мэтью - Основы программирования в Linux краткое содержание
В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек C/C++ и стандартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др. Описана компиляция программ, их компоновка c библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME® и KDE®, хранения данных с использованием СУБД MySQL® и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым.
Для начинающих Linux-программистов
Основы программирования в Linux - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Для манипулирования этими блоками как данными в заголовочном файле ndbm.h определен новый тип данных, названный
datum
. Конкретное содержимое этого типа зависит от реализации, но он должен, как минимум, включать следующие элементы:
void *dptr;
size_t dsize
Здесь
datum
— тип, который будет определяться оператором typedef. В файле ndbm.h также дано определение dbm, представляющее собой структуру, применяемую для доступа к базе данных, и во многом похожее на определение FILE
, используемое для доступа к файлам. Внутреннее содержимое dbm typedef
зависит от реализации и никогда не должно использоваться.
Для ссылки на блок данных при использовании библиотеки dbm вы должны объявить
datum
, задать указатель dptr
для указания на начало данных, а также задать параметр dsize
, содержащий размер данных. На хранящиеся данные и индекс, применяемый для доступа к ним, всегда нужно ссылаться с помощью типа datum
.
О типеDBM
лучше всего думать как об аналоге типаFILE
. Когда вы открываете базу данных dbm, обычно создаются два физических файла: один с расширением pag, а другой с расширением dir. Возвращается один указатель dbm, который применяется для обращения к обоим файлам как к паре. Файлы никогда не следует непосредственно читать и в них не нужно писать; они предназначены для доступа через стандартные операции dbm.
Примечание
В некоторых реализациях эти два файла объединены, и создается один новый файл.
Если вы знакомы с базами данных SQL, то заметите, что в случае базы данных dbm не существует структур таблиц или столбцов. Эти структуры не нужны, т.к. dbm не задает фиксированного размера элементов сохраняемых данных и не требует описания внутренней структуры для них. Библиотека dbm работает с блоками неструктурированных двоичных данных.
Функции доступа dbm
Теперь, когда мы рассказали об основах работы библиотеки dbm, можем поподробнее рассмотреть функции. Далее приведены прототипы основных функций dbm.
#include
DBM *dbm_open(const char* filename, int file_open_flags,
mode_t file_mode);
int dbm_store(DBM *database_descriptor, datum key, datum content,
int store_mode);
datum dbm_fetch(DBM* database descriptor, datum key);
void dbm_close(DBM *database descriptor);
dbm_open
Эта функция применяется для открытия имеющихся баз данных и для создания новых баз данных. Аргумент
filename
— имя файла базы данных без расширения dir или pag.
Остальные параметры такие же, как второй и третий параметры функции
open
, с которой вы встречались в главе 3. Вы можете использовать те же директивы #define
. Второй аргумент управляет возможностью чтения базы данных, записью в нее или обеими операциями. Если создается новая база данных, флаги должны быть двоичными O_READ
с O_CREAT
, чтобы разрешить создание файлов. Третий аргумент задает начальные права доступа к файлам, которые будут созданы.
Функция
dbm_open
возвращает указатель на тип DBM
. Он применяется во всех последующих обращениях к базе данных. В случае аварийного завершения возвращается (DBM*)0
.
dbm_store
Эту функцию применяют для ввода данных в базу данных. Как упоминалось ранее, все данные должны сохраняться с уникальным индексом. Для определения данных, которые вы хотите сохранить, и индекса, используемого для ссылки на них, следует задать два типа datum: один для ссылки на индекс, а другой — на реальные данные. Последний параметр
store_mode
управляет действиями, совершаемыми при попытке сохранить какие-либо данные с применением ключа, который уже существует. Если установлено значение параметра dbm_insert
, сохранение завершается аварийно и функция dbm_store
возвращает 1. Если установлено значение параметра dbm_replace
, новые данные заменяют существующие и dbm_store
возвращает 0. При возникновении других ошибок функция dbm_store
возвращает отрицательные числа.
dbm_fetch
Подпрограмма
dbm_fetch
применяется для извлечения данных из базы данных. Она принимает в качестве параметра указатель dbm, возвращенный предшествующим вызовом функции dbm_open
и тип datum
, который должен быть задан как указатель на ключ. Тип datum
возвращается, если данные, относящиеся к используемому ключу, найдены в базе данных, возвращаемая структура datum
будет иметь значения dptr
и dsize
, ссылающиеся на возвращенные данные. Если ключ не найден, dptr
будет равен null
.
Примечание
Важно помнить, что функция
dbm_fetch
возвращает только параметр типа datum
, содержащий указатель на данные. Реальные данные могут находиться в локальной области памяти внутри библиотеки dbm и должны быть скопированы в переменные программы перед дальнейшими вызовами функций dbm.
dbm_close
Эта подпрограмма закрывает базу данных, открытую функцией
dbm_open
, и должна получить указатель DBM
, возвращенный предшествующим вызовом dbm_open
.
А теперь выполните упражнение 7.12.
Упражнение 7.12. Простая база данных dbm
Познакомившись с основными функциями базы данных dbm, теперь вы знаете, как написать вашу первую программу для работы с dbm (dbm1.c). В этой программе применяется структура, названная
test_data
.
1. Первыми представлены файлы
#include
, директивы #define
, функция main
и объявление структуры test_data
:
#include
#include
#include
#include
#include
/* В некоторых системах вам нужно заменить вышестоящую строку строкой #include */
#include
#define TEST_DB_FILE "/tmp/dbm1_test"
#define ITEMS_USED 3
struct test_data {
char misc_chars[15];
int any_integer;
char more_chars[21];
};
int main() {
2. В функции
main
задайте элементы структур items_to_store
и items_received
, строку key
и типы datum
:
struct test_data items_to_store[ITEMS_USED];
struct test_data item_retrieved;
char key_to_use[20];
int i, result;
datum key_datum;
datum data_datum;
DBM *dbm_ptr;
3. Объявив указатель на структуру типа
DBM
, откройте вашу тестовую базу данных для чтения и записи, создав ее при необходимости:
dbm_ptr = dbm_open(TEST_DB_FILE, O_RDWR | O_CREAT, 0666);
if (!dbm_ptr) {
fprintf (stderr, "Failed to open database\n");
exit(EXIT_FAILURE);
}
4. Теперь добавьте данные в структуру
items_to_store
:
Интервал:
Закладка: