/* * Scrieti un program C (numit A) care creeaza un proces fiu B. Procesul B genereaza un numar aleator intre 100 si 1000. Procesul A genereaza cate un numar aleator intre 50 si 1050 si il trimite procesului B pana cand diferenta absoluta intre numarul generat de B si numarul trimis de A este mai mica decat 50. B afiseaza fiecare numar primit de la A. A va afisa la final numarul de numere generate pana cand conditia de oprire este indeplinita. */ #include #include #include #include #include int main(int argc, char *argv[]) { int f, p2c[2], c2p[2]; pipe(p2c); pipe(c2p); f = fork(); if(f < 0) { perror("Error on fork"); close(p2c[0]); close(p2c[1]); close(c2p[0]); close(c2p[1]); exit(1); } else if (f == 0) { close(p2c[1]); close(c2p[0]); srandom(getpid()); int target = random() % 901 + 100; printf("The child process has generated target number %d\n", target); int received = 0; int found = 0; while(!found) { if(0 > read(p2c[0], &received, sizeof(int))) { perror("C --- Error reading number from pipe"); } printf("The child process received %d from parent\n", received); if(abs(target - received) < 50) { found = 1; printf("Close enough\n"); } if(0 > write(c2p[1], &found, sizeof(int))) { perror("C --- Error writing number to pipe"); } } close(p2c[0]); close(c2p[1]); exit(0); } close(p2c[0]); close(c2p[1]); srandom(getpid()); int guess = 0, found = 0, count = 0; while(!found) { count++; guess = random() % 1001 + 50; printf("Parent is guessing %d\n", guess); if(0 > write(p2c[1], &guess, sizeof(int))) { perror("P --- Error writing number to pipe"); } if(0 > read(c2p[0], &found, sizeof(int))) { perror("P --- Error reading number from pipe"); } } close(p2c[1]); close(c2p[0]); wait(0); printf("Parent guessed after %d tries\n", count); return 0; }