mqtest3.c revision 165829
1/* $FreeBSD: head/tools/regression/mqueue/mqtest3/mqtest3.c 165829 2007-01-06 11:32:15Z davidxu $ */ 2#include <stdio.h> 3#include <mqueue.h> 4#include <fcntl.h> 5#include <signal.h> 6#include <unistd.h> 7#include <sys/select.h> 8 9#define MQNAME "/mytstqueue3" 10#define LOOPS 1000 11#define PRIO 10 12 13void sighandler(int sig) 14{ 15 write(1, "timeout\n", 8); 16 _exit(1); 17} 18 19int main() 20{ 21 mqd_t mq; 22 int status; 23 struct mq_attr attr; 24 int pid; 25 fd_set set; 26 27 mq_unlink(MQNAME); 28 29 attr.mq_maxmsg = 5; 30 attr.mq_msgsize = 128; 31 mq = mq_open(MQNAME, O_CREAT | O_RDWR | O_EXCL, 0666, &attr); 32 if (mq == (mqd_t)-1) 33 err(1, "mq_open()"); 34 status = mq_getattr(mq, &attr); 35 if (status) 36 err(1, "mq_getattr()"); 37 38 pid = fork(); 39 if (pid == 0) { /* child */ 40 int prio, j, i; 41 char *buf; 42 43 mq_close(mq); 44 45 signal(SIGALRM, sighandler); 46 47 mq = mq_open(MQNAME, O_RDWR); 48 if (mq == (mqd_t)-1) 49 err(1, "child process: mq_open"); 50 buf = malloc(attr.mq_msgsize); 51 for (j = 0; j < LOOPS; ++j) { 52 FD_ZERO(&set); 53 FD_SET(__mq_oshandle(mq), &set); 54 alarm(3); 55 status = select(__mq_oshandle(mq)+1, &set, NULL, NULL, NULL); 56 if (status != 1) 57 err(1, "child process: select()"); 58 status = mq_receive(mq, buf, attr.mq_msgsize, &prio); 59 if (status == -1) 60 err(2, "child process: mq_receive"); 61 for (i = 0; i < attr.mq_msgsize; ++i) 62 if (buf[i] != i) 63 err(3, "message data corrupted"); 64 if (prio != PRIO) 65 err(4, "priority is incorrect: %d", 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, prio; 76 77 signal(SIGALRM, sighandler); 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 } 83 alarm(3); 84 FD_ZERO(&set); 85 FD_SET(__mq_oshandle(mq), &set); 86 status = select(__mq_oshandle(mq)+1, NULL, &set, NULL, NULL); 87 if (status != 1) 88 err(1, "select()"); 89 status = mq_send(mq, buf, attr.mq_msgsize, PRIO); 90 if (status) { 91 kill(pid, SIGKILL); 92 err(2, "mq_send()"); 93 } 94 } 95 alarm(3); 96 wait(&status); 97 alarm(0); 98 } 99 status = mq_close(mq); 100 if (status) 101 err(1, "mq_close"); 102 mq_unlink(MQNAME); 103 return (0); 104} 105