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

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

Жанры

UNIX: взаимодействие процессов

Стивенс Уильям Ричард

Шрифт:

49 }

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

Измерение задержки очередей сообщений System V

В листинге А.16 приведен текст программы измерения времени задержки для очередей сообщений System V.

Листинг А.16. Программа измерения времени задержки для очередей сообщений System V

//bench/lat_svmsg.c

1 #include "unpipc.h"

2 struct msgbuf p2child = { 1, { 0 } }; /* type = 1 */

3 struct msgbuf child2p = { 2, { 0 } }; /* type = 2 */

4 struct msgbuf inbuf;

5 void

6 doit(int msgid)

7 {

8 Msgsnd(msgid, &p2child, 0, 0);

9 if (Msgrcv(msgid, &inbuf, sizeof(inbuf.mtext), 2, 0) != 0)

10 err_quit("msgrcv error");

11 }

12 int

13 main(int argc, char **argv)

14 {

15 int i, nloop, msgid;

16 pid_t childpid;

17 if (argc != 2)

18 err_quit("usage: lat_svmsg <#loops>");

19 nloop = atoi(argv[1]);

20 msgid = Msgget(IPC_PRIVATE, IPC_CREAT | SVMSG_MODE);

21 if ((childpid = Fork) == 0) {

22 for(;;) { /* дочерний процесс */

23 if (Msgrcv(msgid, &inbuf, sizeof(inbuf.mtext), 1, 0) != 0)

24 err_quit("msgrcv error");

25 Msgsnd(msgid, &child2p, 0, 0);

26 }

27 exit(0);

28 }

29 /* родительский процесс */

30 doit(msgid);

31 Start_time;

32 for (i = 0; i < nloop; i++)

33 doit(msgid);

34 printf("latency: %.3f usec\n", Stop_time / nloop);

35 Kill(childpid, SIGTERM);

36 Msgctl(msgid, IPC_RMID, NULL);

37 exit(0);

38 }

Мы создаем одну очередь, по которой сообщения передаются в обоих направлениях. Сообщения с типом 1 передаются от родительского процесса дочернему, а сообщения с типом 2 — в обратную сторону. Четвертый аргумент при вызове msgrcv в функции doit имеет значение 2, что обеспечивает получение сообщений только данного типа. Аналогично в дочернем процессе четвертый аргумент msgrcv имеет значение 1.

ПРИМЕЧАНИЕ

В разделах 9.3 и 11.3 мы отмечали, что многие структуры, определенные в ядре, нельзя инициализировать статически, поскольку стандарты Posix.1 и Unix 98 гарантируют лишь наличие определенных полей в этих структурах, но не определяют ни их порядок, ни наличие других полей. В этой программе мы инициализируем структуру msgbuf статически, поскольку очереди сообщений System V гарантируют, что эта структура содержит поле типа сообщения long, за которым следуют передаваемые данные.

Программа измерения задержки интерфейса дверей

Пpoгрaммa измерения задержки для интерфейса дверей дана в листинге А.17. Дочерний процесс создает дверь и связывает с ней функцию server. Родительский процесс открывает дверь и вызывает door_call в цикле. В качестве аргумента передается 1 байт данных, и ничего не возвращается.

Листинг А.17. Программа измерения задержки интерфейса дверей

//bench/lat_door.c

1 #include "unpipc.h"

2 void

3 server(void *cookie, char *argp, size_t arg_size,

4 door_desc_t *dp, size_t n_descriptors)

5 {

6 char c;

7 Door_return(&c, sizeof(char), NULL, 0);

8 }

9 int

10 main(int argc, char **argv)

11 {

12 int i, nloop, doorfd, contpipe[2];

13 char c;

14 pid_t childpid;

15 door_arg_t arg;

16 if (argc != 3)

17 err_quit("usage: lat_door <pathname> <#loops>");

18 nloop = atoi(argv[2]);

19 unlink(argv[1]);

20 Close(Open(argv[1], O_CREAT | O_EXCL | O_RDWR, FILE_MODE));

21 Pipe(contpipe);

22 if ((childpid = Fork) == 0) {

23 doorfd = Door_create(server, NULL, 0);

24 Fattach(doorfd, argv[1]);

25 Write(contpipe[1], &c, 1);

26 for(;;) /* дочерний процесс = сервер */

27 pause;

28 exit(0);

29 }

30 arg.data_ptr = &c; /* родительский процесс = клиент */

31 arg.data_size = sizeof(char);

32 arg.desc_ptr = NULL;

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

Загадка башни

Коган Мстислав Константинович
9. Игра не для слабых
Фантастика:
рпг
фэнтези
попаданцы
5.00
рейтинг книги
Загадка башни

На границе империй. Том 8. Часть 2

INDIGO
13. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 8. Часть 2

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

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

Сильнейший Столп Империи. Книга 5

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

Трапеция

Брэдли Мэрион Зиммер
Проза:
современная проза
5.00
рейтинг книги
Трапеция

"Дальние горизонты. Дух". Компиляция. Книги 1-25

Усманов Хайдарали
Собрание сочинений
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Дальние горизонты. Дух. Компиляция. Книги 1-25

Юнлинг

Метельский Николай Александрович
Фантастика:
героическая фантастика
космическая фантастика
попаданцы
8.35
рейтинг книги
Юнлинг

На границе империй. Том 10. Часть 13

INDIGO
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 13

Бастард Императора. Том 7

Орлов Андрей Юрьевич
7. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 7

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

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

Страх

Рыбаков Анатолий Наумович
2. Дети Арбата
Проза:
историческая проза
9.49
рейтинг книги
Страх

Инженер Петра Великого

Гросов Виктор
1. Инженер Петра Великого
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Инженер Петра Великого

Дважды одаренный. Том IV

Тарс Элиан
4. Дважды одаренный
Фантастика:
городское фэнтези
альтернативная история
аниме
7.00
рейтинг книги
Дважды одаренный. Том IV

Атаман царского Спецназа

Корчевский Юрий Григорьевич
Боевая фантастика Ю. Корчевского
Фантастика:
боевая фантастика
попаданцы
альтернативная история
6.00
рейтинг книги
Атаман царского Спецназа