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

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

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

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

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

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

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

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

Интервал:

Закладка:

Сделать

static int serv_qid = -1;

static int cli_qid = -1;

3. Сделайте сервер ответственным за создание обеих очередей сообщений:

int server starting() {

#if DEBUG_TRACE

printf("%d :- server_starting()\n", getpid());

#endif

serv_qid = msgget((key_t)SERVER_MQUEUE, 0666 | IPC_CREAT);

if (serv_qid == -1) return(0);

cli_qid = msgget((key_t)CLIENT_MQUEUE, 0666 | IPC_CREAT);

if (cli_qid == -1) return(0);

return(1);

}

4. За удаление очереди, если она существует, также отвечает сервер. Когда сервер заканчивает работу, вы задаете недопустимые значения вашим глобальным переменным. Это позволит выловить любые ошибки при попытке сервера отправить сообщения после вызова функции server_ending:

void server_ending() {

#if DEBUG_TRACE

printf("%d :- server_ending()\n", getpid());

#endif

(void)msgctl(serv_qid, IPC_RMID, 0);

(void)msgctl(cli_qid, IPC_RMID, 0);

servqid = -1;

cliqid = -1;

}

5. Серверная функция readчитает из очереди сообщение любого типа (т.е. от любого клиента) и возвращает часть сообщения с данными (пропуская тип сообщения):

int read_request_from_client(message_db_t *rec_ptr) {

struct msg_passed my_msg;

#if DEBUG_TRACE

printf("%d :- read_request_from_client()\n", getpid());

#endif

if (msgrcv(serv_qid, (void *)&my_msg, sizeof(*rec_ptr), 0, 0) == -1) {

return(0);

}

*rec_ptr = my_msg.real_message;

return(1);

}

6. При отправке сообщения для его адресации используется ID клиентского процесса, хранящийся в запросе:

int send_resp_to_client(const message_db_t mess_to_send) {

struct msg_passed my_msg;

#if DEBUG_TRACE

printf("%d :- send_resp_to_client()\n", getpid());

#endif

my_msg.real_message = mess_to_send;

my_msg.msg_key = mess_to_send.client_pid;

if (msgsnd(cli_qid, (void *)&my_msg, sizeof(mess_to_send), 0) == -1) {

return(0);

}

return(1);

}

Пересмотр функций клиента

Теперь нужно внести изменения в клиентские функции.

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

int client starting() {

#if DEBUG_TRACE

printf("%d :- client_starting\n", getpid());

#endif

serv_qid = msgget((key_t)SERVER_MQUEUE, 0666);

if (serv_qid == -1) return(0);

cli_qid = msgget((key_t)CLIENT_MQUEUE, 0666);

if (cli_qid == -1) return(0);

return(1);

}

2. Как и в случае сервера, когда клиент завершает работу, вы задаете некорректные значения глобальных переменных. Это позволит выявить ошибки при попытке клиента отправлять сообщения после вызова функции client_ending.

void client_ending() {

#if DEBUG_TRACE

printf("%d :- client_ending()\n", getpid());

#endif

serv_qid = -1;

cli_qid = -1;

}

3. Для отправки сообщения серверу сохраните данные в своей структуре. Учтите, что вы должны задать ключ сообщения. Поскольку 0 — недопустимое значение для ключа, незаданный ключ означает, что он принимает (очевидно) случайное значение, поэтому иногда эта функция может возвращать ошибку, если значение оказывается нулевым.

int send_mess_to_server(message_db_t mess_to_send) {

struct msg_passed my_msg;

#if DEBUG_TRACE

printf("%d send_mess_to_server()\n", getpid());

#endif

my_msg.real_message = mess_to_send;

my_msg.msg_key = mess_to_send.client_pid;

if (msgsnd(serv_qid, (void *)&my_msg, sizeof(mess_to_send) , 0) == -1) {

perror("Message send failed");

return(0);

}

return(1);

}

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

int read_resp_from_server(message_db_t *rec_ptr) {

struct msg_passed mymsg;

#if DEBUG_TRACE

printf("%d :- read_resp_from_server()\n", getpid());

#endif

if (msgrcv(cli_qid, (void *)&my_msg, sizeof(*rec_ptr), getpid(), 0) == -1) {

return(0);

}

*rec_ptr = my_msg.real_message;

return(1);

}

5. Для сохранения совместимости с файлом pipe_imp.c необходимо объявить четыре дополнительные функции. Но в вашей программе они будут пустыми. Операции, которые они реализовывали в случае применения каналов, больше не нужны.

int start_resp_to_client(const message_db_t mess_to_send) {

return(1);

}

void end_resp_to_client(void) {}

int start_resp_from_server(void) {

return(1);

}

void end_resp_from_server(void) {}

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

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

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

Интервал:

Закладка:

Сделать

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

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


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

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

x