4 #include <sys/select.h>
14 #define MQNAME "/mytstqueue3"
18 void sighandler(int sig)
20 write(1, "timeout\n", 8);
35 attr.mq_msgsize = 128;
36 mq = mq_open(MQNAME, O_CREAT | O_RDWR | O_EXCL, 0666, &attr);
39 status = mq_getattr(mq, &attr);
41 err(1, "mq_getattr()");
44 if (pid == 0) { /* child */
50 signal(SIGALRM, sighandler);
52 mq = mq_open(MQNAME, O_RDWR);
54 err(1, "child process: mq_open");
55 buf = malloc(attr.mq_msgsize);
56 for (j = 0; j < LOOPS; ++j) {
58 FD_SET(__mq_oshandle(mq), &set);
60 status = select(__mq_oshandle(mq)+1, &set, NULL, NULL, NULL);
62 err(1, "child process: select()");
63 status = mq_receive(mq, buf, attr.mq_msgsize, &prio);
65 err(2, "child process: mq_receive");
66 for (i = 0; i < attr.mq_msgsize; ++i)
68 err(3, "message data corrupted");
70 err(4, "priority is incorrect: %d", prio);
76 } else if (pid == -1) {
82 signal(SIGALRM, sighandler);
83 buf = malloc(attr.mq_msgsize);
84 for (j = 0; j < LOOPS; ++j) {
85 for (i = 0; i < attr.mq_msgsize; ++i) {
90 FD_SET(__mq_oshandle(mq), &set);
91 status = select(__mq_oshandle(mq)+1, NULL, &set, NULL, NULL);
94 status = mq_send(mq, buf, attr.mq_msgsize, PRIO);
104 status = mq_close(mq);