1
2 #include <err.h>
3 #include <errno.h>
4 #include <fcntl.h>
5 #include <mqueue.h>
6 #include <signal.h>
7 #include <stdio.h>
8
9 #define MQNAME "/mytstqueue1"
10
11 int
main(void)12 main(void)
13 {
14 struct mq_attr attr, attr2;
15 struct sigevent sigev;
16 mqd_t mq;
17 int status;
18
19 attr.mq_maxmsg = 2;
20 attr.mq_msgsize = 100;
21 mq = mq_open(MQNAME, O_CREAT | O_RDWR | O_EXCL, 0666, &attr);
22 if (mq == (mqd_t)-1)
23 err(1, "mq_open");
24 status = mq_unlink(MQNAME);
25 if (status)
26 err(1, "mq_unlink");
27 status = mq_getattr(mq, &attr2);
28 if (status)
29 err(1, "mq_getattr");
30 if (attr.mq_maxmsg != attr2.mq_maxmsg)
31 err(1, "mq_maxmsg changed");
32 if (attr.mq_msgsize != attr2.mq_msgsize)
33 err(1, "mq_msgsize changed");
34
35 sigev.sigev_notify = SIGEV_SIGNAL;
36 sigev.sigev_signo = SIGRTMIN;
37 status = mq_notify(mq, &sigev);
38 if (status)
39 err(1, "mq_notify");
40 status = mq_notify(mq, &sigev);
41 if (status == 0)
42 err(1, "mq_notify 2");
43 else if (errno != EBUSY)
44 err(1, "mq_notify 3");
45 status = mq_notify(mq, NULL);
46 if (status)
47 err(1, "mq_notify 4");
48 status = mq_close(mq);
49 if (status)
50 err(1, "mq_close");
51 return (0);
52 }
53