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