#include #include #include #include int flag_SIGUSR1 = 0; int flag_SIGUSR2 = 0; void signal_handler(int signum) { switch(signum) { case SIGUSR1: flag_SIGUSR1 = 1; flag_SIGUSR2 = 0; break; case SIGUSR2: flag_SIGUSR1 = 0; flag_SIGUSR2 = 1; break; /** other signals are ignored? */ } } int main(int argc, char *argv[]) { pid_t child; if(signal(SIGUSR1,signal_handler)==SIG_ERR) { printf("Cannot set handler for SIGUSR1\n"); exit(1); } if(signal(SIGUSR2,signal_handler)==SIG_ERR) { printf("Cannot set handler for SIGUSR2\n"); exit(1); } if((child=fork())==0) { /** child stuff - wait for parent */ printf("[Child-%d] Waiting for parent... ",getpid()); while(!flag_SIGUSR1); /* wait for parent signal */ printf("YES! (flag1=%d)(flag2=%d)\n",flag_SIGUSR1,flag_SIGUSR2); /** child stuff - send ack to parent */ printf("[Child-%d] Sending acknowledgement to parent.\n",getpid()); kill(getppid(),SIGUSR1); /** child stuff - wait for parent */ printf("[Child-%d] Waiting for parent... ",getpid()); while(!flag_SIGUSR2); /* wait for parent signal */ printf("YES! (flag1=%d)(flag2=%d)\n",flag_SIGUSR1,flag_SIGUSR2); /** child stuff - send ack to parent */ printf("[Child-%d] Sending acknowledgement to parent.\n",getpid()); kill(getppid(),SIGUSR2); } else { /** parent stuff - send 'command' to child */ printf("[Parent-%d] Sending 'command' to child.\n",getpid()); kill(child,SIGUSR1); /** parent stuff - wait for child */ printf("[Parent-%d] Waiting for child response... ",getpid()); while(!flag_SIGUSR1); /* wait for child signal */ printf("YES! (flag1=%d)(flag2=%d)\n",flag_SIGUSR1,flag_SIGUSR2); /** parent stuff - send 'command' to child */ printf("[Parent-%d] Sending 'command' to child.\n",getpid()); kill(child,SIGUSR2); /** parent stuff - wait for child */ printf("[Parent-%d] Waiting for child response... ",getpid()); while(!flag_SIGUSR2); /* wait for child signal */ printf("YES! (flag1=%d)(flag2=%d)\n",flag_SIGUSR1,flag_SIGUSR2); } printf("[%d] Done\n",getpid()); return 0; }