return to first page linux journal archive
keywordscontents

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