Listing 1. Example Distributed Program
/*
* 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);
}