/* * SPDsoft * */ #include #include #include #include #include #include #include #include int s; int kids=0; int done; void do_wait(int signal); int main(int argc, char *argv[]) { char *myname; char *host; char *user; int pid; int killed; pid_t pgrp; char str[512]; #ifdef _BSD_SIGNALS fprintf(stderr,"ooo USING BSD SIGNALS ooo\n"); #endif switch( pid = fork()) { case -1: perror("fork"); break; case 0: { char *arg[10]; int i=0; arg[i++]="foo.sh"; arg[i++]=NULL; #ifdef _BSD_SIGNALS # ifdef sgi pgrp=BSDsetpgrp(0,0); # else # ifdef SunOS4x pgrp=setpgrp(0,0); # else pgrp=setpgrp(); # endif # endif if ( -1 == pgrp ) perror("+ setpgrp"); #endif #ifdef _BSD_SIGNALS # ifdef sgi pgrp = BSDgetpgrp(0); # else # ifdef SunOS4x pgrp = getpgrp(0); # else pgrp = getpgrp(); # endif # endif if ( -1 == pgrp ) perror("+ getpgrp"); sprintf(str, "+ son's pgrp %d\n", pgrp ); write(2,str,strlen(str)); #endif execv( arg[0], arg ); perror("execv"); } break; default: /* sleep(1);*/ #ifdef _BSD_SIGNALS # ifdef sgi pgrp = BSDgetpgrp(pid); # else # ifdef SunOS4x pgrp = getpgrp(pid); # else #ifndef _HPUX_SOURCE pgrp = getpgid(pid); #endif # endif # endif #ifndef _HPUX_SOURCE if ( -1 == pgrp ) perror("- getpgrp"); #else /* * HPUX won't let us know the pgrp for a pid which is not in our pgrp * ...so we will fake it. (seems to work) */ pgrp=pid; #endif sprintf(str, "\n- son's pgrp %d\n", pgrp ); write(2,str,strlen(str)); #endif #ifdef _BSD_SIGNALS if (SIG_ERR == signal(SIGCHLD, do_wait)) #else if (SIG_ERR == sigset(SIGCHLD, do_wait)) #endif perror("signal"); sprintf(str, "- spawned %d\n", pid ); write(2,str,strlen(str)); sleep(1); #ifdef _BSD_SIGNALS sprintf(str,"- killpg -TERM %d\n",pgrp); write(2,str,strlen(str)); killed=killpg(pgrp,SIGTERM); #else pgrp=pid; sprintf(str,"- kill -TERM %d\n",pid); write(2,str,strlen(str)); killed=kill(pid,SIGTERM); #endif if ( -1 == killed ) { perror("- kill -TERM"); sprintf(str,"kill -TERM PID %d: %d\n",pgrp, killed); write(2,str,strlen(str)); } sleep(1); sprintf(str,"Bye...\n"); fflush(stderr); write(2,str,strlen(str)); break; } } void do_wait(int sig) { int status; int wpid; wpid = wait ( &status ); fprintf(stderr, "wait: died %d\n", wpid); if (WIFSTOPPED(status)) { fprintf(stderr,"stoped %d\n", WSTOPSIG(status)); } else if(WIFEXITED(status)) { fprintf(stderr, "do_wait: %d exit with %d\n", wpid, WEXITSTATUS(status)); } else if(WIFSIGNALED(status)) { fprintf(stderr,"signaled %d\n", WTERMSIG(status)); } if(status&0200) fprintf(stderr, "core dumped\n"); fprintf(stderr, "do_wait: died %d\n", wpid); fflush(stderr); }