#include #include #include #include #include #include #define EXE "pvm_signal" void signal_h(int); int signal_recv = 0; sigset_t sigset; int main(){ int mytid, mygid; int child; mytid = pvm_mytid(); if(pvm_parent() == PvmNoParent){ struct sigaction newact; sigset_t blockset; sigset_t emptyset; mygid = pvm_joingroup("master"); newact.sa_handler = signal_h; newact.sa_flags = 0; sigemptyset(&newact.sa_mask); sigemptyset(&emptyset); sigemptyset(&blockset); sigaddset(&blockset, SIGUSR1); sigaddset(&newact.sa_mask, SIGUSR1); if(sigaction(SIGUSR1, &newact, NULL) < 0) fprintf(stderr, "Failed to install handler!\n"); pvm_spawn(EXE,NULL,PvmTaskDefault,NULL,1,&child); sigprocmask(SIG_BLOCK, &blockset, NULL); while(!signal_recv) sigsuspend(&emptyset); sigprocmask(SIG_SETMASK, &emptyset, NULL); } else{ //Do nothing for a while, then signal the master mygid = pvm_joingroup("slave"); sleep(5); pvm_sendsig(pvm_parent(),SIGUSR1); } pvm_exit(); return 1; } void signal_h(int signo){ if(signo == SIGUSR1){ fprintf(stderr, "Got a SIGUSR1\n"); signal_recv = 1; } }