5 #include <sys/select.h>
15 #define MQNAME "/mytstqueue5"
19 void sighandler(int sig)
21 write(1, "timeout\n", 8);
38 sigaddset(&set, SIGRTMIN);
39 sigprocmask(SIG_BLOCK, &set, NULL);
40 sigemptyset(&sa.sa_mask);
41 sa.sa_flags = SA_SIGINFO;
42 sa.sa_sigaction = (void *) SIG_DFL;
43 sigaction(SIGRTMIN, &sa, NULL);
46 attr.mq_msgsize = 128;
47 mq = mq_open(MQNAME, O_CREAT | O_RDWR | O_EXCL, 0666, &attr);
50 status = mq_getattr(mq, &attr);
52 err(1, "mq_getattr()");
54 if (pid == 0) { /* child */
57 struct sigevent sigev;
59 signal(SIGALRM, sighandler);
61 sigev.sigev_notify = SIGEV_SIGNAL;
62 sigev.sigev_signo = SIGRTMIN;
63 sigev.sigev_value.sival_int = 2;
66 mq = mq_open(MQNAME, O_RDWR | O_NONBLOCK);
68 err(1, "child: mq_open");
69 buf = malloc(attr.mq_msgsize);
70 for (j = 0; j < LOOPS; ++j) {
72 status = mq_notify(mq, &sigev);
74 err(1, "child: mq_notify");
75 status = sigwaitinfo(&set, &info);
77 err(1, "child: sigwaitinfo");
78 if (info.si_value.sival_int != 2)
79 err(1, "child: sival_int");
80 status = mq_receive(mq, buf, attr.mq_msgsize, &prio);
82 err(2, "child: mq_receive");
83 for (i = 0; i < attr.mq_msgsize; ++i)
85 err(3, "child: message data corrupted");
87 err(4, "child: priority is incorrect: %d",
94 } else if (pid == -1) {
100 signal(SIGALRM, sighandler);
101 buf = malloc(attr.mq_msgsize);
102 for (j = 0; j < LOOPS; ++j) {
103 for (i = 0; i < attr.mq_msgsize; ++i) {
107 status = mq_send(mq, buf, attr.mq_msgsize, PRIO);
117 status = mq_close(mq);