mqtest3.c revision 152832
1/* $FreeBSD: head/tools/regression/mqueue/mqtest3/mqtest3.c 152832 2005-11-26 13:19:09Z 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 int mq, status; 22 struct mq_attr attr; 23 int pid; 24 fd_set set; 25 26 mq_unlink(MQNAME); 27 28 attr.mq_maxmsg = 5; 29 attr.mq_msgsize = 128; 30 mq = mq_open(MQNAME, O_CREAT | O_RDWR | O_EXCL, 0666, &attr); 31 if (mq == -1) 32 err(1, "mq_open()"); 33 status = mq_getattr(mq, &attr); 34 if (status) 35 err(1, "mq_getattr()"); 36 37 pid = fork(); 38 if (pid == 0) { /* child */ 39 int prio, j, i; 40 char *buf; 41 42 mq_close(mq); 43 44 signal(SIGALRM, sighandler); 45 46 mq = mq_open(MQNAME, O_RDWR); 47 if (mq == -1) 48 err(1, "child process: mq_open"); 49 buf = malloc(attr.mq_msgsize); 50 for (j = 0; j < LOOPS; ++j) { 51 FD_ZERO(&set); 52 FD_SET(mq, &set); 53 alarm(3); 54 status = select(mq+1, &set, NULL, NULL, NULL); 55 if (status != 1) 56 err(1, "child process: select()"); 57 status = mq_receive(mq, buf, attr.mq_msgsize, &prio); 58 if (status == -1) 59 err(2, "child process: mq_receive"); 60 for (i = 0; i < attr.mq_msgsize; ++i) 61 if (buf[i] != i) 62 err(3, "message data corrupted"); 63 if (prio != PRIO) 64 err(4, "priority is incorrect: %d", prio); 65 } 66 alarm(0); 67 free(buf); 68 mq_close(mq); 69 return (0); 70 } else if (pid == -1) { 71 err(1, "fork()"); 72 } else { 73 char *buf; 74 int i, j, prio; 75 76 signal(SIGALRM, sighandler); 77 buf = malloc(attr.mq_msgsize); 78 for (j = 0; j < LOOPS; ++j) { 79 for (i = 0; i < attr.mq_msgsize; ++i) { 80 buf[i] = i; 81 } 82 alarm(3); 83 FD_ZERO(&set); 84 FD_SET(mq, &set); 85 status = select(mq+1, NULL, &set, NULL, NULL); 86 if (status != 1) 87 err(1, "select()"); 88 status = mq_send(mq, buf, attr.mq_msgsize, PRIO); 89 if (status) { 90 kill(pid, SIGKILL); 91 err(2, "mq_send()"); 92 } 93 } 94 alarm(3); 95 wait(&status); 96 alarm(0); 97 } 98 status = mq_close(mq); 99 if (status) 100 err(1, "mq_close"); 101 mq_unlink(MQNAME); 102 return (0); 103} 104