/* * hello.h by Kamran Karimi * Header file for hello1.c and hello2.c */ #include <stdio.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <errno.h> #define MSG_KEY 40 #define MSG_MODE (IPC_DIPC | IPC_EXCL | 0777) /* use of 'IPC_DIPC' is the ONLY thing that makes * this program a distributed * one. Everything * else is normal System V IPC programming */ #define MSG_TYPE 10 #define MSG_SIZE 512 struct message { long mtype; char mtext[MSG_SIZE]; }; /* * hello1.c by Kamran Karimi * It initializes a message structure and waits * to receive a message. * After running hello1, you should run hello2 on * a remote machine. */ #include "hello.h" int main() { int msgid; struct message mess; /* create the message queue. The other * process will access it later */ msgid = msgget(MSG_KEY, MSG_MODE | IPC_CREAT); if(msgid < 0) { fprintf(stderr, "Hello1: msgget() failed BECAUSE %s\n", strerror(errno)); exit(20); } fprintf(stderr, "Hello1: waiting to receive a message.\n"); if(msgrcv(msgid, (struct msgbuf *)&mess, sizeof(mess.mtext), 0, 0) < 0) fprintf(stderr, "Hello1: msgrcv() failed BECAUSE %s\n", strerror(errno)); else fprintf(stderr, "Hello1: Received '%s'\n",mess.mtext); msgctl(msgid,IPC_RMID,NULL); exit(0); } /* * hello2.c by Kamran Karimi * This program sends a message to hello1 process. * You should first run hello1, and then hello2 on * a machine in the same cluster */ #include "hello.h" int main() { int msgid; struct message mess; /* gain access to the message queue that was * created by hello1 */ msgid = msgget(MSG_KEY, MSG_MODE); if(msgid < 0) { fprintf(stderr, "Hello2: msgget() failed BECAUSE %s\n", strerror(errno)); exit(20); } mess.mtype = MSG_TYPE; /* not used here */ strcpy(mess.mtext, "Hello, Distributed Programming!"); /* now send the message. This will traverse * the network if hello1 and hello2 programs * are in different computers and DIPC is * properly installed */ if(msgsnd(msgid, (struct msgbuf *)&mess, sizeof(mess.mtext), 0) < 0) { fprintf(stderr, "Hello2: msgsnd() failed BECAUSE %s\n", strerror(errno)); exit(20); } exit(0); }