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

Здесь есть возможность читать онлайн «Нейл Мэтью - Основы программирования в Linux» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: Санкт-Петербург, Год выпуска: 2009, ISBN: 2009, Издательство: «БХВ-Петербург», Жанр: Программирование, ОС и Сети, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

Основы программирования в Linux: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Основы программирования в Linux»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

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

Основы программирования в Linux — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Основы программирования в Linux», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

static void process_command(const message_db_t mess_command);

void catch_signals() {

server_running = 0;

}

2. Теперь переходите к функции main. После проверки успешного завершения подпрограмм захвата сигнала программа проверяет, передали ли вы -iв командной строке. Если да, она создаст новую базу данных. Если вызов подпрограммы database_initializeв файле cd_dbm.c завершится аварийно, будет выведено сообщение об ошибке. Если все хорошо и сервер работает, любые запросы от клиента направляются функции process_command, которую вы вскоре увидите.

int main(int argc, char *argv[]) {

struct sigaction new_action, old_action;

message_db_t mess command;

int database_init_type = 0;

new_action.sa_handler = catch_signals;

sigemptyset(&new_action.sa_mask);

new_action.sa_flags = 0;

if ((sigaction(SIGINT, &new_action, &old_action) != 0) ||

(sigaction(SIGHUP, &new_action, &old_action) != 0) ||

(sigaction(SIGTERM, &new_action, &old_action) != 0)) {

fprintf(stderr, "Server startup error, signal catching failed\n");

exit(EXIT_FAILURE);

}

if (argc > 1) {

argv++;

if (strncmp("-i", *argv, 2) == 0) database_init_type = 1;

}

if (!database_initialize(database_init_type)) {

fprintf(stderr, "Server error :-\

could not initialize database\n");

exit (EXIT_FAILURE);

}

if (!server starting()) exit(EXIT_FAILURE);

while(server_running) {

if (read_request_from_client(&mess_command)) {

process_command(mess_command);

} else {

if (server_running) fprintf(stderr,

"Server ended — can not read pipe\n");

server_running = 0;

}

} /* while */

server_ending();

exit(EXIT_SUCCESS);

}

3. Любые сообщения клиентов направляются в функцию process_command, где они обрабатываются в операторе case, который выполняет соответствующие вызовы из файла cd_dbm.c.

static void process_command(const message_db_t comm) {

message_db_t resp;

int first_time = 1;

resp = comm; /* копирует команду обратно,

затем изменяет resp, как требовалось */

if (!start_resp_to_client(resp)) {

fprintf(stderr, "Server Warning:

start_resp_to_client %d failed\n", resp.client_pid);

return;

}

resp.response = r_success;

memset(resp.error_text, '\0', sizeof(resp.error_text));

save_errno = 0;

switch(resp.request) {

case s_create_new_database:

if (!database initialize(1))

resp.response = r_failure;

break;

case s_get_cdc_entry:

resp.cdc_entry_data =

get_cdc_entry(comm.cdc_entry_data.catalog);

break;

case s_get_cdt_entry:

resp.cdt_entry_data =

get_cdt_entry(comm.cdt_entry_data.catalog,

comm.cdt_entry_data.track_no);

break;

case s_add_cdc_entry:

if (!add_cdc_entry(comm.cdc_entry_data))

resp.response = r_failure;

break;

case s_add_cdt_entry:

if (!add_cdt_entry(comm.cdt_entry_data))

resp.response = r_failure;

break;

case s_del_cdc_entry:

if (!del_cdc_entry(comm.cdc_entry_data.catalog))

resp.response = r_failure;

break;

case s_del_cdt_entry:

if (!del_cdt_entry(comm.cdt_entry_data.catalog,

comm.cdt_entry_data.track_no)) resp.response = r_failure;

break;

case s_find_cdc_entry:

do {

resp.cdc_entry_data =

search_cdc_entry(comm.cdc_entry_data.catalog, &first_time);

if (resp.cdc_entry_data.catalog[0] != 0) {

resp.response = r_success;

if (!send_resp_to_client(resp)) {

fprintf(stderr,

"Server Warning:- failed to respond to %d\n", resp.client_pid);

break;

}

} else {

resp.response = r_find_no_more;

}

} while (resp.response == r_success);

break;

default:

resp.response = r_failure;

break;

} /* switch */

sprintf(resp.error_text,

"Command failed:\n\t%s\n", strerror(save_errno));

if (!send_resp_to_client(resp)) {

fprintf(stderr,

"Server Warning:- failed to respond to %d\n", resp.client_pid);

}

end_resp_to_client();

return;

}

Прежде чем рассматривать действующую реализацию канала, давайте обсудим последовательность событий, которые должны произойти для передачи данных между клиентским и серверным процессами. На рис. 13.9 показан запуск обоих, и клиентского, и серверного, процессов, а также то, как они образуют петлю во время обработки команд и ответов.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

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

Представляем Вашему вниманию похожие книги на «Основы программирования в Linux» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «Основы программирования в Linux»

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

x