Пример: программа mqgetattr
Программа из листинга 5.3 открывает указанную очередь сообщений и выводит значения ее атрибутов.
Листинг 5.8. Отправка sigusr1 при помещении сообщения в пустую очередь (неправильная версия программы)
//pxmsg/mqnotifysigl.c
1 #include "unpipc.h"
2 mqd_t mqd;
3 void *buff;
4 struct mq_attr attr;
5 struct sigevent sigev;
6 static void sig_usrl(int);
7 int
8 main(int argc, char **argv)
9 {
10 if (argc != 2)
11 err_quit("usage: mqnotifysig1
12 /* открываем очередь, получаем атрибуты, выделяем буфер */
13 mqd = Mq_open(argv[1], O_RDONLY);
14 Mq_getattr(mqd, &attr);
15 buff = Malloc(attr.mq_msgsize);
16 /* устанавливаем обработчик, включаем уведомление */
17 Signal(SIGUSR1, sig_usr1);
18 sigev.sigev_notify = SIGEV_SIGNAL;
19 sigev.sigev_signo = SIGUSR1;
20 Mq_notify(mqd, &sigev);
21 for (;;)
22 pause(); /* все делает обработчик */
23 exit(0);
24 }
25 static void
26 sig_usr1(int signo)
27 {
28 ssize_t n;
29 Mq_notify(mqd, &sigev); /* сначала перерегистрируемся */
30 n = Mq_receive(mqd, buff, attr.mq_msgsize, NULL);
31 printf("SIGUSR1 received, read %ld bytes\n", (long) n);
32 return;
33 }