#include #include #include #include #include #include #include #define UNDEFINED -1 void geninput ( int n ) { FILE *fp; int i; fp = (FILE *)fopen("C1input.txt", "w"); for (i=0; i *key) { if (*rchild == UNDEFINED) { pipe(rfd); *rchild = fork(); if (*rchild == 0) { *parent = getppid(); *key = *lchild = *rchild = UNDEFINED; *ndisc = 0; pfd[0] = rfd[0]; pfd[1] = rfd[1]; lfd[0] = lfd[1] = rfd[0] = rfd[1] = UNDEFINED; } } if (*rchild != UNDEFINED) write(rfd[1], keybuff, 16); } else { ++(*ndisc); printf(" Process %5d with parent %5d gets key = %4d [ Old, discarded ]\n", getpid(), *parent, nextkey); fflush(stdout); } } } int calcheight ( int parent, int lchild, int rchild, int pfd[], int lfd[], int rfd[] ) { char htbuff[16] = ""; int ht, lht, rht; lht = rht = -1; if (lchild != UNDEFINED) { read(lfd[0], htbuff, 16); sscanf(htbuff, "%d", &lht); } if (rchild != UNDEFINED) { read(rfd[0], htbuff, 16); sscanf(htbuff, "%d", &rht); } ht = 1 + ( (lht >= rht) ? lht : rht); sprintf(htbuff, "%15d", ht); if (parent != UNDEFINED) write(pfd[1], htbuff, 16); return ht; } void inorder ( int key, int parent, int lchild, int rchild, int pfd[], int lfd[], int rfd[] ) { char notbuff[1] = ""; if (parent != UNDEFINED) read(pfd[0], notbuff, 1); if (lchild != UNDEFINED) { write(lfd[1], notbuff, 1); waitpid(lchild, NULL, 0); } printf(" %d", key); fflush(stdout); if (rchild != UNDEFINED) { write(rfd[1], notbuff, 1); waitpid(rchild, NULL, 0); } } void synchronize ( int n, int ndisc, int parent, int sfd[], int tfd[] ) { int i; char syncbuff[1024] = ""; if (parent == UNDEFINED) { for (i=0; i 1) n = atoi(argv[1]); else scanf("%d", &n); geninput(n); key = parent = lchild = rchild = UNDEFINED; pfd[0] = pfd[1] = lfd[0] = lfd[1] = rfd[0] = rfd[1] = UNDEFINED; n = ndisc = 0; initroot(); pipe(sfd); pipe(tfd); pipe(ufd); pipe(vfd); buildproctree(&key, &parent, &lchild, &rchild, &n, &ndisc, pfd, lfd, rfd); synchronize(n, ndisc, parent, sfd, tfd); h = calcheight(parent, lchild, rchild, pfd, lfd, rfd); printf(" Height of the process %5d with key %4d is %d %s\n", getpid(), key, h, (parent == UNDEFINED) ? "[Height of entire tree]" : ""); fflush(stdout); synchronize(n, ndisc, parent, ufd, vfd); if (parent == UNDEFINED) { printf("+++ Inorder listing of the keys:"); fflush(stdout); } inorder(key, parent, lchild, rchild, pfd, lfd, rfd); if (parent == UNDEFINED) printf("\n\n"); exit(0); }