// file: h1.c // Comp.Sys.Org.II, Spring 2005, Tracy Kapp. // GCD program using processes // #include #include #include #include #include #include #include #include #include extern int errno; /* system error number */ void syserr(char* ); /* error report, abort routine */ int terms; int terms_left; int main(int argc, char *argv[]) { char *error, *numstr; char buf[1024]; int par2child[50][2]; /* Parent can write to child pipe */ int child2par[50][2]; /* Child can write to parent pipe */ int index = 1, m, n, i; boolean infinite = true; terms = (argc - 1)/2: signal(SIGUSR1, int_handler); int parent_id = getid(); for (i = 0; i< terms; i++){ m = atoi(argv[2*i +1]); n = atoi(argv[2*i +2]); /* Open pipes */ if (pipe(par2child[i]) == -1 || pipe(child2par[i]) == -1) { perror("pipe"); exit(1); } else { set_fl(child2par[i][0], O_NONBLOCK); } switch(fork()){ case -1: perror("fork"); exit(1); break; case 0: //parent close(par2child[i][0]); close(child2par[i][1]); break; default: //child close(par2child[i][1]); close(child2par[i][0]); sleep(1); // remove this if you don't need it... while (n>0) { // 1. write m, n to pipe // 2. signal parent kill(parent_id, SIGUSR1); // 3. read from parent }//while printf("gcd=%d\n", m); //kill(parent_id, SIGUSR2); exit(0) break; }//switch }//for for (i=0; i< terms; i++) wait(); return 0; }//main ////////////////////////////////////////////////// // Clear buffer ////////////////////////////////////////////////// void clearbuf(char *){ int i; for (i=0; i<1024; i++) char[i]='\0'; } ////////////////////////////////////////////////// // interrupt handler ////////////////////////////////////////////////// void int_handler(int sig) { int m,n,ans, count; //reset the signal handler? signal(SIGUSR1, int_handler); for(int i=0; i0) { sscanf(buf,"%d %d", &m, &n); // write back the answer "m%n" return(0); }//if }//for }//int_handler