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