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

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

Жанры

Основы программирования в 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, но поскольку информация, которую следует передавать, очень мала по объему, есть смысл реализовать передачу запросов и ответов непосредственно с помощью очередей сообщений.

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

Кодекс Охотника. Книга ХХ

Винокуров Юрий
20. Кодекс Охотника
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга ХХ

Бояръ-Аниме. Газлайтер. Том 30

Володин Григорий Григорьевич
30. История Телепата
Фантастика:
альтернативная история
аниме
фэнтези
5.00
рейтинг книги
Бояръ-Аниме. Газлайтер. Том 30

Неучтенный элемент. Том 6

NikL
6. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 6

Адепт. Том второй. Каникулы

Бубела Олег Николаевич
7. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.05
рейтинг книги
Адепт. Том второй. Каникулы

Узы крови

Шелдон Сидни
Детективы:
прочие детективы
9.30
рейтинг книги
Узы крови

Главный рубильник. Расцвет и гибель информационных империй от радио до интернета

Ву Тим
Деловая литература:
о бизнесе популярно
5.00
рейтинг книги
Главный рубильник. Расцвет и гибель информационных империй от радио до интернета

Вернувшийся: Новая жизнь. Том I

Vector
1. Вернувшийся
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Вернувшийся: Новая жизнь. Том I

Око василиска

Кас Маркус
2. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Око василиска

Курсант: назад в СССР 9

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

Хозяин Теней 5

Петров Максим Николаевич
5. Безбожник
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Хозяин Теней 5

Чайлдфри

Тоцка Тала
Любовные романы:
современные любовные романы
6.51
рейтинг книги
Чайлдфри

Я С СССР! Том III

Вязовский Алексей
3. Я спас СССР
Фантастика:
альтернативная история
5.86
рейтинг книги
Я С СССР! Том III

Вечный. Книга VI

Рокотов Алексей
6. Вечный
Фантастика:
рпг
фэнтези
5.00
рейтинг книги
Вечный. Книга VI

Кодекс Охотника. Книга VII

Винокуров Юрий
7. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
4.75
рейтинг книги
Кодекс Охотника. Книга VII