From 1243ecf308a35e81f98d1e519602b5ddf3cab494 Mon Sep 17 00:00:00 2001
From: Guo Wenxue <guowenxue@gmail.com>
Date: Sat, 08 Dec 2018 01:01:08 +0800
Subject: [PATCH] add IPC Message Queue sample code

---
 ch6_ipc/semaphore.c       |    3 
 ch6_ipc/msgqueue_sender.c |   63 +++++++++++++++++++++
 ch6_ipc/msgqueue_recver.c |   61 ++++++++++++++++++++
 3 files changed, 125 insertions(+), 2 deletions(-)

diff --git a/ch6_ipc/msgqueue_recver.c b/ch6_ipc/msgqueue_recver.c
new file mode 100644
index 0000000..04ebf6e
--- /dev/null
+++ b/ch6_ipc/msgqueue_recver.c
@@ -0,0 +1,61 @@
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/msg.h>
+
+#define FTOK_PATH            "/dev/zero"
+#define FTOK_PROJID          0x22
+
+typedef struct s_msgbuf 
+{
+     long  mtype; 
+     char  mtext[512]; 
+} t_msgbuf;
+
+int main(int argc, char **argv)
+{
+    key_t             key;
+    int               msgid;
+    t_msgbuf          msgbuf;
+    int               msgtype;
+    int               i;
+
+    if( (key=ftok(FTOK_PATH, FTOK_PROJID)) < 0 ) 
+    {   
+	printf("ftok() get IPC token failure: %s\n", strerror(errno)); 
+	return -1;
+    }
+
+    msgid = msgget(key, IPC_CREAT|0666);
+    if( msgid < 0)
+    {
+	printf("shmget() create shared memroy failure: %s\n", strerror(errno));
+	return -2;
+    }
+
+    msgtype = msgtype = (int)key;
+    printf("key[%d] msgid[%d] msgypte[%d]\n", (int)key, msgid, msgtype);
+
+    for(i=0; i<4; i++)
+    {
+	memset(&msgbuf,0,sizeof(msgbuf));
+	if( msgrcv(msgid, &msgbuf, sizeof(msgbuf.mtext), msgtype, IPC_NOWAIT) < 0 )
+	{
+            printf("msgsnd() receive message failure: %s\n", strerror(errno));
+	    break;
+	}
+
+	printf("Receive Message: %s\n", msgbuf.mtext);
+	sleep(1);
+    }
+
+    msgctl(msgid, IPC_RMID, NULL);
+
+    return 0;
+}
+
diff --git a/ch6_ipc/msgqueue_sender.c b/ch6_ipc/msgqueue_sender.c
new file mode 100644
index 0000000..9e962b8
--- /dev/null
+++ b/ch6_ipc/msgqueue_sender.c
@@ -0,0 +1,63 @@
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/msg.h>
+
+#define FTOK_PATH            "/dev/zero"
+#define FTOK_PROJID          0x22
+
+typedef struct s_msgbuf 
+{
+     long  mtype; 
+     char  mtext[512]; 
+} t_msgbuf;
+
+int main(int argc, char **argv)
+{
+    key_t             key;
+    int               msgid;
+    t_msgbuf          msgbuf;
+    int               msgtype;
+    int               i;
+
+    if( (key=ftok(FTOK_PATH, FTOK_PROJID)) < 0 ) 
+    {   
+	printf("ftok() get IPC token failure: %s\n", strerror(errno)); 
+	return -1;
+    }
+
+    msgid = msgget(key, IPC_CREAT|0666);
+    if( msgid < 0)
+    {
+	printf("shmget() create shared memroy failure: %s\n", strerror(errno));
+	return -2;
+    }
+
+    msgtype = (int)key;
+    printf("key[%d] msgid[%d] msgypte[%d]\n", (int)key, msgid, msgtype);
+
+    for(i=0; i<4; i++)
+    {
+        msgbuf.mtype = msgtype;
+        strcpy(msgbuf.mtext,"Ping");
+
+	if( msgsnd(msgid, &msgbuf, sizeof(msgbuf.mtext), IPC_NOWAIT) < 0)
+	{
+            printf("msgsnd() send message failure: %s\n", strerror(errno));
+	    break;
+	}
+	printf("Send message: %s\n", msgbuf.mtext);
+
+	sleep(1);
+    }
+
+    msgctl(msgid, IPC_RMID, NULL);
+
+    return 0;
+}
+
diff --git a/ch6_ipc/semaphore.c b/ch6_ipc/semaphore.c
index 6f5e6df..b64987f 100644
--- a/ch6_ipc/semaphore.c
+++ b/ch6_ipc/semaphore.c
@@ -57,8 +57,7 @@
     semaphore_p(semid);
     printf("Parent start do something now...\n");
     sleep(2);
-    printf("Child process exit and ");
-
+    printf("Perent process destroy semaphore and exit\n");
 
     semaphore_term(semid);
     return 0;

--
Gitblit v1.9.1