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