Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/tests/sys/mqueue/mqtest4.c
39483 views
1
2
#include <sys/types.h>
3
#include <sys/event.h>
4
#include <sys/select.h>
5
#include <sys/wait.h>
6
#include <err.h>
7
#include <fcntl.h>
8
#include <mqueue.h>
9
#include <signal.h>
10
#include <stdio.h>
11
#include <stdlib.h>
12
#include <unistd.h>
13
14
#define MQNAME "/mytstqueue4"
15
#define LOOPS 1000
16
#define PRIO 10
17
18
static void
19
sighandler(int sig __unused)
20
{
21
write(1, "timeout\n", 8);
22
_exit(1);
23
}
24
25
int
26
main(void)
27
{
28
struct kevent kev;
29
struct mq_attr attr;
30
mqd_t mq;
31
int kq, status;
32
pid_t pid;
33
34
mq_unlink(MQNAME);
35
36
attr.mq_maxmsg = 5;
37
attr.mq_msgsize = 128;
38
mq = mq_open(MQNAME, O_CREAT | O_RDWR | O_EXCL, 0666, &attr);
39
if (mq == (mqd_t) -1)
40
err(1, "mq_open()");
41
status = mq_getattr(mq, &attr);
42
if (status)
43
err(1, "mq_getattr()");
44
pid = fork();
45
if (pid == 0) { /* child */
46
char *buf;
47
int j, i;
48
unsigned int prio;
49
50
mq_close(mq);
51
kq = kqueue();
52
mq = mq_open(MQNAME, O_RDWR);
53
if (mq == (mqd_t)-1)
54
err(1, "child: mq_open");
55
EV_SET(&kev, mq_getfd_np(mq), EVFILT_READ, EV_ADD, 0, 0, 0);
56
status = kevent(kq, &kev, 1, NULL, 0, NULL);
57
if (status == -1)
58
err(1, "child: kevent");
59
buf = malloc(attr.mq_msgsize);
60
for (j = 0; j < LOOPS; ++j) {
61
alarm(3);
62
status = kevent(kq, NULL, 0, &kev, 1, NULL);
63
if (status != 1)
64
err(1, "child: kevent 2");
65
status = mq_receive(mq, buf, attr.mq_msgsize, &prio);
66
if (status == -1)
67
err(2, "child: mq_receive");
68
for (i = 0; i < attr.mq_msgsize; ++i)
69
if (buf[i] != i)
70
err(3, "child: message data corrupted");
71
if (prio != PRIO)
72
err(4, "child: priority is incorrect: %d",
73
prio);
74
}
75
alarm(0);
76
free(buf);
77
mq_close(mq);
78
return (0);
79
} else if (pid == -1) {
80
err(1, "fork()");
81
} else {
82
char *buf;
83
int i, j;
84
85
signal(SIGALRM, sighandler);
86
kq = kqueue();
87
EV_SET(&kev, mq_getfd_np(mq), EVFILT_WRITE, EV_ADD, 0, 0, 0);
88
status = kevent(kq, &kev, 1, NULL, 0, NULL);
89
if (status == -1)
90
err(1, "kevent");
91
buf = malloc(attr.mq_msgsize);
92
for (j = 0; j < LOOPS; ++j) {
93
for (i = 0; i < attr.mq_msgsize; ++i) {
94
buf[i] = i;
95
}
96
alarm(3);
97
status = kevent(kq, NULL, 0, &kev, 1, NULL);
98
if (status != 1)
99
err(1, "child: kevent 2");
100
status = mq_send(mq, buf, attr.mq_msgsize, PRIO);
101
if (status) {
102
err(2, "mq_send()");
103
}
104
}
105
free(buf);
106
alarm(3);
107
wait(&status);
108
alarm(0);
109
}
110
status = mq_close(mq);
111
if (status)
112
err(1, "mq_close");
113
mq_unlink(MQNAME);
114
return (0);
115
}
116
117