sysmsg.c
948 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// RUN: %clang -O1 %s -o %t && %run %t
// UNSUPPORTED: android
#include <assert.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <sys/msg.h>
#define CHECK_STRING "hello, world!"
#define MSG_BUFLEN 0x100
int main() {
int msgq = msgget(IPC_PRIVATE, 0666);
if (msgq == -1) perror("msgget:");
assert(msgq != -1);
struct msg_s {
long mtype;
char string[MSG_BUFLEN];
};
struct msg_s msg = {
.mtype = 1};
strcpy(msg.string, CHECK_STRING);
int res = msgsnd(msgq, &msg, MSG_BUFLEN, IPC_NOWAIT);
if (res) {
fprintf(stderr, "Error sending message! %s\n", strerror(errno));
msgctl(msgq, IPC_RMID, NULL);
return -1;
}
struct msg_s rcv_msg;
ssize_t len = msgrcv(msgq, &rcv_msg, MSG_BUFLEN, msg.mtype, IPC_NOWAIT);
assert(len == MSG_BUFLEN);
assert(msg.mtype == rcv_msg.mtype);
assert(!memcmp(msg.string, rcv_msg.string, MSG_BUFLEN));
msgctl(msgq, IPC_RMID, NULL);
return 0;
}