Чтение онлайн

на главную - закладки

Жанры

Основы программирования в Linux
Шрифт:

int main {

 int running = 1;

 int msgid;

 struct my_msg_st some_data;

 long int msg_to_receive = 0;

2. Прежде всего, задайте очередь сообщений:

 msgid = msgget((key_t)1234, 0666 | IPC_CREAT);

 if (msgid == -1) {

fprintf(stderr, "msgget failed with error: %d\n", errno);

exit(EXIT_FAILURE);

 }

3. Далее

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

 while (running) {

if (msgrcv(msgid, (void *)&some_data, BUFSIZ, msg_to_receive, 0) == -1) {

fprintf(stderr, "msgrcv failed with error: %d\n", errno);

exit(EXIT_FAILURE);

}

printf("You wrote: %s", some_data.some_text);

if (strncmp(some_data.some_text, "end", 3) == 0) {

running = 0;

}

 }

 if (msgctl(msgid, IPC_RMID, 0) == -1) {

fprintf(stderr, "msgctl(IPC_RMID) failed\n");

exit(EXIT_FAILURE);

 }

 exit(EXIT_SUCCESS);

}

4. Программа-отправитель msg2.c очень похожа на программу msg1.с. В функции main удалите объявление

msg_to_receive
и замените его переменной
buffer[BUFSIZ]
. Уберите из программы удаление очереди и внесите следующие изменения в цикл с управляющей переменной
running
. Теперь у вас появился вызов функции msgsnd для отправки введенного текста в очередь сообщений. Далее приведена программа msg2.c с отличиями от программы msg1.с, выделенными цветом.

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <errno.h>

#include <unistd.h>

#include <sys/msg.h>

#define MAX_TEXT 512

struct my_msg_st {

 long int my_msg_type;

 char some_text[MAX_TEXT];

};

int main {

 int running = 1;

 struct my_msg_st some_data;

 int msgid;

 char buffer = [BUFSIZ];

 msgid = msgget((key_t)1234, 0666 | IPC_CREAT);

 if (msgid == -1) {

fprintf(stderr, "msgget failed with error: %d\n", errno);

exit(EXIT_FAILURE);

 }

 while (running) {

printf("Enter some text: ");

fgets(buffer, BUFSIZ, stdin);

some_data.my_msg_type = 1;

strcpy(some_data.some_text, buffer);

if (msgsnd(msgid, (void*)&some_data, MAX_TEXT, 0)) == -1) {

fpintf(stderr, "msgsnd failed\n");

exit(EXIT_FAILURE);

}

if (strncmp(buffer, "end", 3) == 0) {

running = 0;

}

 }

 exit(EXIT_SUCCESS);

}

В

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

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

$ ./msg2

Enter some text: hello

Enter some text: How are you today?

Enter some text: end

$ ./msg1

You wrote: hello

You wrote: How are you today?

You wrote: end

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

Программа-отправитель создает очередь сообщений с помощью функции

msgget
; далее она добавляет сообщения в очередь, применяя функцию
msgsnd
. Программа-приемник получает идентификатор очереди сообщений с помощью функции
msgget
и получает сообщения до тех пор, пока не будет найден специальный текст
end
. Затем программа приводит все в порядок, удаляя очередь сообщений с помощью функции
msgctl
.

Приложение для работы с базой данных компакт-дисков

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

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

Поделиться:
Популярные книги

Красноармеец

Поселягин Владимир Геннадьевич
1. Красноармеец
Фантастика:
боевая фантастика
попаданцы
4.60
рейтинг книги
Красноармеец

Изгой Проклятого Клана

Пламенев Владимир
1. Изгой
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Изгой Проклятого Клана

Сердце Дракона. Том 12

Клеванский Кирилл Сергеевич
12. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.29
рейтинг книги
Сердце Дракона. Том 12

Последний Паладин

Саваровский Роман
1. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин

Московское золото и нежная попа комсомолки. Часть Пятая

Хренов Алексей
5. Летчик Леха
Фантастика:
попаданцы
5.00
рейтинг книги
Московское золото и нежная попа комсомолки. Часть Пятая

Фиктивный брак

Завгородняя Анна Александровна
Фантастика:
фэнтези
6.71
рейтинг книги
Фиктивный брак

Идеальный мир для Лекаря 20

Сапфир Олег
20. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 20

Сфирот

Прокофьев Роман Юрьевич
8. Стеллар
Фантастика:
боевая фантастика
рпг
6.92
рейтинг книги
Сфирот

Убивать чтобы жить 5

Бор Жорж
5. УЧЖ
Фантастика:
боевая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 5

Кодекс Крови. Книга ХIV

Борзых М.
14. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Крови. Книга ХIV

Найденыш

Шмаков Алексей Семенович
2. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Найденыш

Адвокат Империи 4

Карелин Сергей Витальевич
4. Адвокат империи
Фантастика:
городское фэнтези
аниме
дорама
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Адвокат Империи 4

Наследие Маозари 6

Панежин Евгений
6. Наследие Маозари
Фантастика:
попаданцы
постапокалипсис
рпг
фэнтези
эпическая фантастика
5.00
рейтинг книги
Наследие Маозари 6

Печать мастера

Лисина Александра
6. Гибрид
Фантастика:
попаданцы
технофэнтези
аниме
фэнтези
6.00
рейтинг книги
Печать мастера