/* Failure notification example Demonstrates how to tell when a task exits */ /* defines and prototypes for the PVM library */ #include <pvm3.h> /* Maximum number of children this program will spawn */ #define MAXNCHILD 20 /* Tag to use for the task done message */ #define TASKDIED 11
int main(int argc, char* argv[]) { /* number of tasks to spawn, use 3 as the default */ int ntask = 3; /* return code from pvm calls */ int info; /* my task id */ int mytid; /* my parents task id */ int myparent; /* children task id array */ int child[MAXNCHILD]; int i, deadtid; int tid; char *argv[5];
/* find out my task id number */ mytid = pvm_mytid(); /* check for error */ if (mytid < 0) { /* print out the error */ pvm_perror(argv[0]); /* exit the program */ return -1; } /* find my parent's task id number */ myparent = pvm_parent();
/* exit if there is some error other than PvmNoParent */ if ((myparent < 0) && (myparent != PvmNoParent)) { pvm_perror(argv[0]); pvm_exit(); return -1; } /* if i don't have a parent then i am the parent */ if (myparent == PvmNoParent) { /* find out how many tasks to spawn */ if (argc == 2) ntask = atoi(argv[1]); /* make sure ntask is legal */ if ((ntask < 1) || (ntask > MAXNCHILD)) { pvm_exit(); return 0; } /* spawn the child tasks */ info = pvm_spawn(argv[0], (char**)0, PvmTaskDebug, (char*)0, ntask, child); /* make sure spawn succeeded */ if (info != ntask) { pvm_exit(); return -1; } /* print the tids */ for (i = 0; i < ntask; i++) printf("t%x\t",child[i]); putchar('\n'); /* ask for notification when child exits */ info = pvm_notify(PvmTaskExit, TASKDIED, ntask, child); if (info < 0) { pvm_perror("notify"); pvm_exit(); return -1; }
/* reap the middle child */ info = pvm_kill(child[ntask/2]); if (info < 0) { pvm_perror("kill"); pvm_exit(); return -1; } /* wait for the notification */ info = pvm_recv(-1, TASKDIED); if (info < 0) { pvm_perror("recv"); pvm_exit(); return -1; } info = pvm_upkint(&deadtid, 1, 1); if (info < 0) pvm_perror("calling pvm_upkint"); /* should be the middle child */ printf("Task t%x has exited.\n", deadtid); printf("Task t%x is middle child.\n", child[ntask/2]); pvm_exit(); return 0; } /* i'm a child */ sleep(63); pvm_exit(); return 0; }