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