Jump to content
mastervlad

Problema C in Unix

Recommended Posts

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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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 by mastervlad
Link to comment
Share on other sites

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 functie

LE: ce am spus eu in primul post de inregistrat copii era o greseala, nu e necesar.

Edited by phreak
Link to comment
Share on other sites

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 functie

LE: 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 by mastervlad
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...