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 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