1 2 #include <sys/types.h> 3 #include <sys/wait.h> 4 #include <err.h> 5 #include <fcntl.h> 6 #include <mqueue.h> 7 #include <signal.h> 8 #include <stdio.h> 9 #include <stdlib.h> 10 #include <unistd.h> 11 12 #define MQNAME "/mytstqueue2" 13 #define LOOPS 1000 14 #define PRIO 10 15 16 static void 17 alarmhandler(int sig __unused) 18 { 19 write(1, "timeout\n", 8); 20 _exit(1); 21 } 22 23 int 24 main(void) 25 { 26 struct mq_attr attr; 27 mqd_t mq; 28 int status; 29 pid_t pid; 30 31 mq_unlink(MQNAME); 32 33 attr.mq_maxmsg = 5; 34 attr.mq_msgsize = 128; 35 mq = mq_open(MQNAME, O_CREAT | O_RDWR | O_EXCL, 0666, &attr); 36 if (mq == (mqd_t)-1) 37 err(1, "mq_open"); 38 status = mq_getattr(mq, &attr); 39 if (status) 40 err(1, "mq_getattr"); 41 pid = fork(); 42 if (pid == 0) { /* child */ 43 char *buf; 44 int j, i; 45 unsigned int prio; 46 47 mq_close(mq); 48 49 signal(SIGALRM, alarmhandler); 50 51 mq = mq_open(MQNAME, O_RDWR); 52 if (mq == (mqd_t)-1) 53 err(1, "child: mq_open"); 54 buf = malloc(attr.mq_msgsize); 55 for (j = 0; j < LOOPS; ++j) { 56 alarm(3); 57 status = mq_receive(mq, buf, attr.mq_msgsize, &prio); 58 if (status == -1) 59 err(2, "child: mq_receive"); 60 for (i = 0; i < attr.mq_msgsize; ++i) 61 if (buf[i] != i) 62 err(3, "child: message data corrupted"); 63 if (prio != PRIO) 64 err(4, "child: priority is incorrect: %d", 65 prio); 66 } 67 alarm(0); 68 free(buf); 69 mq_close(mq); 70 return (0); 71 } else if (pid == -1) { 72 err(1, "fork()"); 73 } else { 74 char *buf; 75 int i, j; 76 77 signal(SIGALRM, alarmhandler); 78 buf = malloc(attr.mq_msgsize); 79 for (j = 0; j < LOOPS; ++j) { 80 for (i = 0; i < attr.mq_msgsize; ++i) 81 buf[i] = i; 82 alarm(3); 83 status = mq_send(mq, buf, attr.mq_msgsize, PRIO); 84 if (status) 85 err(1, "mq_send"); 86 } 87 alarm(3); 88 wait(&status); 89 alarm(0); 90 } 91 status = mq_close(mq); 92 if (status) 93 err(1, "mq_close"); 94 mq_unlink(MQNAME); 95 return (0); 96 } 97