mastervlad Posted November 28, 2014 Report Posted November 28, 2014 Scrieti un program care numara aparitiile unui sir de caractere ca subcuvant in alt sir de caractere (cele doua siruri sunt date ca argumente in linia de comanda). De fiecare data cand se verifica daca primul sir apare ca subcuvant incepand de pe o pozitie, verificarea se va face de catre un proces fiu (obtinut cu fork) iar procesul tata nu asteapta ca acesta sa se termine pentru a initia o cautare incepand de la o alta pozitie - astfel verificarile au loc in paralel.Am o idee despre cum ar trebui sa fie programul, dar nu-mi dau seama cum sa fac mai multe procese care sa verifice de pe diferite pozitii daca s1 se afla ca subcuvant in s2, plus ca aceasta se face cu strstr. Mersi mult de ajutor. Quote
phreak Posted November 28, 2014 Report Posted November 28, 2014 Parintele incepe strlen (s2) procese sau pe ce baza initiaza alta cautare?Nu vreau sa-ti dau algoritmul mura in gura dar in linii mari ar trebui sa faci fork de fiecare data cand ai o pozitie noua, verifici dupa fork daca esti in copil sau parinte, in copil faci cautarea si returnezi rezultatul iar in parinte adaugi copilul intr-o lista de copii pe care-i verifici la final. Rezultatele copiilor fiind luate din return_code Quote
mastervlad Posted November 28, 2014 Author Report Posted November 28, 2014 (edited) Fiecare proces fiu returneaza 0 = nu s-a verificat (nu apare ca subcuvant de la pozitia respectiva), 1 = s-a verificat. Dupa initierea tuturor cautarilor, procesul tata asteapta sa i se termine toti fii si aduna codurile lor de retur - acesta valoarea se afisaza (este numarul de aparitii ca subcuvant).Practic, verific incepand de pe prima pozitie pana la strlen(s2)? Deci ar trebui sa fac fork de strlen(s2) ori?PS.int verificare(char *s1, char *s2, int lungime){ pid_t pid; int i,status; for (i = 1; i <= lungime; i++) { pid = fork(); switch (pid) { case -1: return EXIT_FAILURE; case 0: if (strstr(s1, s2) != NULL) return 1; else return 0; default: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?} waitpid(pid, &status, 0); if (WIFEXITED(status)) printf("Copilul %d, codul de retur %d\n", pid, WEXITSTATUS(status)); return status; }} Edited November 28, 2014 by mastervlad Quote
phreak Posted November 28, 2014 Report Posted November 28, 2014 (edited) Ai niste probleme acolo : - i-ul trebuie sa inceapa de la 0 si trebuie sa fie strict mai mic decat lungimea - cand kidpid = 0 inseamna ca esti in procesul parinte - nu stiu cum chemi functia asta dar din procesul copil trebuie sa iesi de tot din program cu valoarea aia asa ca ori chemi functia exit ori trebuie sa ai grija ca in main() sa ai ceva de genul "return verificare (...);" - tu acum astepti dupa fiecare copil si iesi din functieLE: ce am spus eu in primul post de inregistrat copii era o greseala, nu e necesar. Edited November 28, 2014 by phreak Quote
mastervlad Posted November 28, 2014 Author Report Posted November 28, 2014 (edited) Ai niste probleme acolo : - i-ul trebuie sa inceapa de la 0 si trebuie sa fie strict mai mic decat lungimea - cand kidpid = 0 inseamna ca esti in procesul parinte - nu stiu cum chemi functia asta dar din procesul copil trebuie sa iesi de tot din program cu valoarea aia asa ca ori chemi functia exit ori trebuie sa ai grija ca in main() sa ai ceva de genul "return verificare (...);" - tu acum astepti dupa fiecare copil si iesi din functieLE: ce am spus eu in primul post de inregistrat copii era o greseala, nu e necesar.Am modificat i-ul, la 2 te referi cand pid=0 ca e procesul parinte? Am pus _exit(); dupa return 0, e ok asa? In loc de ????? mai trebuie sa pun ceva? Edited November 28, 2014 by mastervlad Quote