Consider this the extension of the previous post on Message Queue. We will see how we can retrieve messages of different types.
Write2.c
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 40 41 | #include <stdio.h> #include <sys/ipc.h> #include <sys/msg.h> #include <string.h> struct msgbuf { long mtype; char mtext[20]; } mymsg; int main() { key_t key; int msgid; key=ftok("dummy.txt",65); msgid = msgget(key,0666 | IPC_CREAT); printf("Key - %x ;MessageId - %d \n",key,msgid); mymsg.mtype = 1; strcpy(mymsg.mtext,"its my world 1 \0"); msgsnd(msgid,&mymsg,strlen(mymsg.mtext),0); printf("Sent Type: %d Data: %s\n",mymsg.mtype,mymsg.mtext); mymsg.mtype = 2; strcpy(mymsg.mtext,"its my world 2 \0"); msgsnd(msgid,&mymsg,strlen(mymsg.mtext),0); printf("Sent Type: %d Data: %s\n",mymsg.mtype,mymsg.mtext); mymsg.mtype = 3; strcpy(mymsg.mtext,"its my world 3 \0"); msgsnd(msgid,&mymsg,strlen(mymsg.mtext),0); printf("Sent Type: %d Data: %s\n",mymsg.mtype,mymsg.mtext); mymsg.mtype = 4; strcpy(mymsg.mtext,"its my world 4 \0"); msgsnd(msgid,&mymsg,strlen(mymsg.mtext),0); printf("Sent Type: %d Data: %s\n",mymsg.mtype,mymsg.mtext); return 0; } |
Read2.c
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 | #include<stdio.h> #include <sys/ipc.h> #include <sys/msg.h> #include <errno.h> struct msgbuf { long mtype; char mtext[20]; } mymsg; int main(int argc, char *argv[]) { key_t key; int msgid; int type; type = atoi(argv[1]); key=ftok("dummy.txt",65); msgid=msgget(key,0644); printf("Key - %x ;MessageId - %d \n",key,msgid); while (1) { msgrcv(msgid,&mymsg,sizeof(mymsg),type,IPC_NOWAIT); if (errno == ENOMSG) { printf("No messages\n"); break; } else { printf("Received Data,%s\n",mymsg.mtext); printf("Received Data type, %d\n\n",mymsg.mtype); } } return 0; } |
- Line 16 - Passing the 'message type' as command line argument
- Line 22 - We run the while loop to receive all the messages available with the mentioned message type.
- Line 24 - The last argument IPC_NOWAIT is used to instruct 'msgrcv' to return immediately if there is no message present in queue. 'errno' will be set with 'ENOMSG' when this happens.
Demonstration
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 | [root@msgq]# ./write2 Key - 41014da0 ;MessageId - 327680 Sent Type: 1 Data: its my world 1 Sent Type: 2 Data: its my world 2 Sent Type: 3 Data: its my world 3 Sent Type: 4 Data: its my world 4 [root@msgq]# ./read2 3 Key - 41014da0 ;MessageId - 327680 Received Data,its my world 3 Received Data type, 3 No messages [root@msgq]# ./read2 3 Key - 41014da0 ;MessageId - 327680 No messages [root@msgq]# ./read2 2 Key - 41014da0 ;MessageId - 327680 Received Data,its my world 2 Received Data type, 2 No messages [root@msgq]# ./read2 4 Key - 41014da0 ;MessageId - 327680 Received Data,its my world 4 Received Data type, 4 No messages |
- Line 1-6 - Populating 4 types of messages in the message queue
- Line 8 - Receive message type 3. Successful
- Line 15 - Receive message type 3. No message present
- Line 19 - Receive message type 2. Successful
- Line 26 - Receive message type 4. Successful
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | [root@msgq]# ./write2 Key - 41014da0 ;MessageId - 360448 Sent Type: 1 Data: its my world 1 Sent Type: 2 Data: its my world 2 Sent Type: 3 Data: its my world 3 Sent Type: 4 Data: its my world 4 [root@msgq]# ./read2 0 Key - 41014da0 ;MessageId - 360448 Received Data,its my world 1 Received Data type, 1 Received Data,its my world 2 Received Data type, 2 Received Data,its my world 3 Received Data type, 3 Received Data,its my world 4 Received Data type, 4 No messages |
- Line 1-6 - Populating messages of different type
- Line 8 - Passing the value of type 0
- Line 10-20 - Receiving the messages 1, 2, 3, 4 in the same order as in lines 1-6
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 | [root@msgq]# ./write2 Key - 41014da0 ;MessageId - 360448 Sent Type: 1 Data: its my world 1 Sent Type: 2 Data: its my world 2 Sent Type: 3 Data: its my world 3 Sent Type: 4 Data: its my world 4 [root@msgq]# ./read2 -2 Key - 41014da0 ;MessageId - 360448 Received Data,its my world 1 Received Data type, 1 Received Data,its my world 2 Received Data type, 2 No messages [root@msgq]# ipcrm -a [root@msgq]# ./write2 Key - 41014da0 ;MessageId - 393216 Sent Type: 1 Data: its my world 1 Sent Type: 2 Data: its my world 2 Sent Type: 3 Data: its my world 3 Sent Type: 4 Data: its my world 4 [root@msgq]# ./read2 -3 Key - 41014da0 ;MessageId - 393216 Received Data,its my world 1 Received Data type, 1 Received Data,its my world 2 Received Data type, 2 Received Data,its my world 3 Received Data type, 3 No messages |
- Line 1-6 - Populating messages of different types
- Line 8 - Receiving the type '-2', meaning retrieve all messages less than type 2 in FIFO order
- Line 18 - Clearing the message queue
- Line 20-25 - Populating messages of different types
- Line 27 - Receiving the type '-3', meaning retrieve all messages less than type 3 in FIFO order