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

Тут можно читать онлайн Нейл Мэтью - Основы программирования в Linux - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-osnet, издательство «БХВ-Петербург», год 2009. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Основы программирования в Linux
  • Автор:
  • Жанр:
  • Издательство:
    «БХВ-Петербург»
  • Год:
    2009
  • Город:
    Санкт-Петербург
  • ISBN:
    978-5-9775-0289-4
  • Рейтинг:
    4/5. Голосов: 91
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

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

Основы программирования в Linux - описание и краткое содержание, автор Нейл Мэтью, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

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

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

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

Основы программирования в Linux - читать книгу онлайн бесплатно, автор Нейл Мэтью
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

void server_ending(void) {

#if DEBUG_TRACE

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

#endif

(void)close(server_fd);

(void)unlink(SERVER_PIPE);

}

3. Функция read_request_from_clientбудет блокировать чтение в серверном канале до тех пор, пока клиент не запишет в него сообщение.

int read_request_from_client(message_db_t *rec_ptr) {

int return_code = 0;

int read_bytes;

#if DEBUG_TRACE

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

#endif

if (server_fd != -1) {

read_bytes = read(server_fd, rec_ptr, sizeof(*rec_ptr));

...

}

return(return_code);

}

4. В особом случае, когда ни у одного клиента нет канала, открытого для записи, вызов readвернет 0, т.е. он обнаружит EOF (метку конца файла). Затем сервер закроет канал и откроет его снова так, что канал блокируется до тех пор, пока клиент также не откроет канал. Выполняется то же, что и при первом запуске сервера; вы инициализировали сервер повторно. Вставьте этот программный код в предыдущую функцию.

if (read_bytes == 0) {

(void)close(server_fd);

if ((server_fd = open(SERVER_PIPE, O_RDONLY)) == -1) {

if (errno != EINTR) {

fprintf(stderr, "Server error, FIFO open failed\n");

}

return(0);

}

read_bytes = read(server_fd, rec_ptr, sizeof(*rec_ptr));

}

if (read_bytes == sizeof(*rec_ptr)) return_code = 1;

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

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

Прокладка каналов

1. Сначала откройте канал клиента.

int start_resp_to_client(const message_db_t mess_to_send) {

#if DEBUG_TRACE

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

#endif

(void)sprintf(client_pipe_name, CLIENT_PIPE,

mess_to_send.client_pid);

if ((client_fd = open(client_pipe_name, O_WRONLY)) == -1) return(0);

return(1);

}

2. Все сообщения отправляются с помощью данной функции. Соответствующие клиентские функции, которые принимают сообщение, вы увидите позже.

int send_resp_to_client(const message_db_t mess_to_send) {

int write_bytes;

#if DEBUG_TRACE

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

#endif

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

write_bytes = write(client_fd, &mess_to_send, sizeof(mess_to_send));

if (write_bytes != sizeof(mess_to_send)) return(0);

return(1);

}

3. В заключение закройте клиентский канал.

void end resp_to_client(void) {

#if DEBUG_TFACE

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

#endif

if (client_fd != -1) {

(void)close(сlient_fd);

client_fd = -1;

}

}

Функции на стороне клиента

Дополнение к серверу — клиентские функции в файле pipe_imp.c. Они очень похожи на серверные функции за исключением функции с интригующим именем send_mess_to_server.

Клиентские функции

1. После проверки доступности сервера функция client_startingинициализирует канал клиентской стороны.

int client_starting(void) {

#if DEBUG_TFACE

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

#endif

mypid = getpid();

if ((server_fd = open(SERVER_PIPE, O_WRONLY)) == -1) {

fprintf(stderr, "Server not running\n");

return(0);

}

(void)sprintf(client pipe name, CLIENT_PIPE, mypid);

(void)unlink(client_pipe_name);

if (mkfifo(client_pipe_name, 0777) == -1) {

fprintf(stderr, "Unable to create client pipe %s\n", client_pipe_name);

return(0);

}

return(1);

}

2. Функция client_endingзакрывает файловые дескрипторы и удаляет ненужный теперь именованный канал.

void client_ending(void) {

#if DEBUG_TRACE

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

#endif

if (client_write_fd != -1) (void)close(client_write_fd);

if (client_fd != -1) (void)close(client_fd);

if (server_fd != -1) (void)close(server_fd);

(void)unlink(client_pipe_name);

}

3. Функция send_mess_to_serverпередает запрос через канал сервера.

int send_mess_to_server(message_db_t mess_to_send) {

int write_bytes;

#if DEBUG_TRACE

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

#endif

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

mess_to_send.client_pid = mypid;

write_bytes = write(server_fd, &mess_to_send, sizeof(mess_to_send));

if (write_bytes != sizeof(mess_to_send)) return(0);

return(1);

}

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

Получение результатов с сервера

1. Данная клиентская функция запускается для ожидания ответа сервера. Она открывает канал клиента только для чтения и затем повторно открывает файл канала только для записи. Чуть позже в этом разделе вы поймете почему.

int start_resp_from_server(void) {

#if DEBUG_TRACE

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

#endif

if (client_pipe_name[0] == '\0') return(0);

if (client_fd != -1) return(1);

client_fd = open(client_pipe_name, O_RDONLY);

if (client_fd != -1) {

client_write_fd = open(client_pipe_name, O_WRONLY);

if (client_write_fd != -1) return(1);

(void)close(client_fd);

client_fd = -1;

}

return(0);

}

2. Далее приведена основная операция read, которая получает с сервера совпадающие элементы базы данных.

int read_resp_from_server(message_db_t *rec_ptr) {

int read_bytes;

int return_code = 0;

#if DEBUG_TRACE

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

#endif

if (!rec_ptr) return(0);

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

read_bytes = read(client_fd, rec_ptr, sizeof(*rec_ptr));

if (read_bytes = sizeof(*rec_ptr)) return_code = 1;

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

Интервал:

Закладка:

Сделать


Нейл Мэтью читать все книги автора по порядку

Нейл Мэтью - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




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


Отзывы читателей о книге Основы программирования в Linux, автор: Нейл Мэтью. Читайте комментарии и мнения людей о произведении.


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

Напишите свой комментарий
x