7 #include <sys/select.h>
11 #define MQNAME "/mytstqueue5"
15 void sighandler(int sig)
17 write(1, "timeout\n", 8);
34 sigaddset(&set, SIGRTMIN);
35 sigprocmask(SIG_BLOCK, &set, NULL);
36 sigemptyset(&sa.sa_mask);
37 sa.sa_flags = SA_SIGINFO;
38 sa.sa_sigaction = (void *) SIG_DFL;
39 sigaction(SIGRTMIN, &sa, NULL);
42 attr.mq_msgsize = 128;
43 mq = mq_open(MQNAME, O_CREAT | O_RDWR | O_EXCL, 0666, &attr);
46 status = mq_getattr(mq, &attr);
48 err(1, "mq_getattr()");
50 if (pid == 0) { /* child */
53 struct sigevent sigev;
55 signal(SIGALRM, sighandler);
57 sigev.sigev_notify = SIGEV_SIGNAL;
58 sigev.sigev_signo = SIGRTMIN;
59 sigev.sigev_value.sival_int = 2;
62 mq = mq_open(MQNAME, O_RDWR | O_NONBLOCK);
64 err(1, "child: mq_open");
65 buf = malloc(attr.mq_msgsize);
66 for (j = 0; j < LOOPS; ++j) {
68 status = mq_notify(mq, &sigev);
70 err(1, "child: mq_notify");
71 status = sigwaitinfo(&set, &info);
73 err(1, "child: sigwaitinfo");
74 if (info.si_value.sival_int != 2)
75 err(1, "child: sival_int");
76 status = mq_receive(mq, buf, attr.mq_msgsize, &prio);
78 err(2, "child: mq_receive");
79 for (i = 0; i < attr.mq_msgsize; ++i)
81 err(3, "child: message data corrupted");
83 err(4, "child: priority is incorrect: %d",
90 } else if (pid == -1) {
96 signal(SIGALRM, sighandler);
97 buf = malloc(attr.mq_msgsize);
98 for (j = 0; j < LOOPS; ++j) {
99 for (i = 0; i < attr.mq_msgsize; ++i) {
103 status = mq_send(mq, buf, attr.mq_msgsize, PRIO);
113 status = mq_close(mq);