Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/tests/sys/mqueue/mqtest2.c
39483 views
1
2
#include <sys/types.h>
3
#include <sys/wait.h>
4
#include <err.h>
5
#include <fcntl.h>
6
#include <mqueue.h>
7
#include <signal.h>
8
#include <stdio.h>
9
#include <stdlib.h>
10
#include <unistd.h>
11
12
#define MQNAME "/mytstqueue2"
13
#define LOOPS 1000
14
#define PRIO 10
15
16
static void
17
alarmhandler(int sig __unused)
18
{
19
write(1, "timeout\n", 8);
20
_exit(1);
21
}
22
23
int
24
main(void)
25
{
26
struct mq_attr attr;
27
mqd_t mq;
28
int status;
29
pid_t pid;
30
31
mq_unlink(MQNAME);
32
33
attr.mq_maxmsg = 5;
34
attr.mq_msgsize = 128;
35
mq = mq_open(MQNAME, O_CREAT | O_RDWR | O_EXCL, 0666, &attr);
36
if (mq == (mqd_t)-1)
37
err(1, "mq_open");
38
status = mq_getattr(mq, &attr);
39
if (status)
40
err(1, "mq_getattr");
41
pid = fork();
42
if (pid == 0) { /* child */
43
char *buf;
44
int j, i;
45
unsigned int prio;
46
47
mq_close(mq);
48
49
signal(SIGALRM, alarmhandler);
50
51
mq = mq_open(MQNAME, O_RDWR);
52
if (mq == (mqd_t)-1)
53
err(1, "child: mq_open");
54
buf = malloc(attr.mq_msgsize);
55
for (j = 0; j < LOOPS; ++j) {
56
alarm(3);
57
status = mq_receive(mq, buf, attr.mq_msgsize, &prio);
58
if (status == -1)
59
err(2, "child: mq_receive");
60
for (i = 0; i < attr.mq_msgsize; ++i)
61
if (buf[i] != i)
62
err(3, "child: message data corrupted");
63
if (prio != PRIO)
64
err(4, "child: priority is incorrect: %d",
65
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;
76
77
signal(SIGALRM, alarmhandler);
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
alarm(3);
83
status = mq_send(mq, buf, attr.mq_msgsize, PRIO);
84
if (status)
85
err(1, "mq_send");
86
}
87
alarm(3);
88
wait(&status);
89
alarm(0);
90
}
91
status = mq_close(mq);
92
if (status)
93
err(1, "mq_close");
94
mq_unlink(MQNAME);
95
return (0);
96
}
97
98