| // 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; |
| } |