Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <signal.h>
- #include <sys/wait.h>
- #include <stdlib.h>
- #include <string.h>
- /*
- * IMI CER SCUZE PENTRU MESAJELE MELE DE "DEBUG" SI PENTRU CE PRINTEZ :|
- * nu-mi place c asa ca macar prin astea sa ma distrez si eu putin
- * Muie Dragnea si PSD :)
- * Pana acum am deschis pipe-urile si le-am inchis unde era nevoie
- * Comunica intre ele urmatoarele procese :
- * Tata [W]-[R] Fiu 1
- * Fiu 1 [W]-[R] Fiu 2
- *
- */
- int child_pid1 = 0;
- int child_pid2 = 0;
- int status;
- char litera;
- int child_pid;
- int main(int argc, char argv[])
- {
- int pfd1[2],pfd2[2],pfd3[2];
- int fd;
- char writebuff[1024];
- if(pipe(pfd1)<0)
- {
- perror("Eroare la crearea pipe-ului 1\n");
- exit(1);
- }
- if(pipe(pfd2)<0)
- {
- perror("Eroare la crearea pipe-ului 2\n");
- exit(1);
- }
- if(pipe(pfd3)<0)
- {
- perror("Eroare la crearea pipe-ului 3\n");
- exit(1);
- }
- /* if( ( fd=open(argv[argc],O_RDONLY)) <0)
- {
- perror("eroare la deschiderea fisierului de input");
- }
- */
- if((child_pid1=fork()) < 0)
- {
- perror("eroare la crearea primului copil\n");
- }
- else if (child_pid1 == 0 )
- // functionalitate copil 1
- {
- close(pfd1[1]); //copilul 1 nu scrie in primul pipe
- close(pfd2[0]); //copilul 1 nu citeste din al doilea pipe
- close(pfd3[0]); //copilul 1 nu scrie in al treilea pipe
- close(pfd3[1]); //copilul 1 nu citeste din al treilea pipe
- char am_citit[10];
- // printf("Sunt copilul 1 si exist si eu dar nu stiu daca m-am terminat sau nu \n");
- printf("copilul 1 a primit de la parinte : ");
- while(read(pfd1[0],am_citit,1))
- {
- printf("%s",am_citit);
- if(am_citit[0]>='0' && am_citit[0]<='9')
- write(pfd2[1],am_citit,1);
- }
- printf("\n");
- close(pfd2[1]); //Am terminat de scris catre copilul 2
- exit(1);
- }
- else
- if((child_pid2=fork()) < 0)
- {
- perror("eroare la crearea celui de-al doilea copil\n");
- }
- else
- {
- if (child_pid2 == 0 )
- // functionalitate copil 2
- {
- int statistica[10]={0,0,0,0,0,0,0,0,0,0};
- char am_citit[10];
- close(pfd1[1]); //copilul 2 nu scrie in primul pipe
- close(pfd1[0]); //copilul 2 nu citeste din primul pipe
- close(pfd2[1]); //copilul 2 nu scrie in doilea pipe
- close(pfd3[0]); //copilul 2 nu citeste din al treilea pipe
- //printf("Sunt copilul 2 si exist si eu dar nu stiu daca m-am terminat sau nu \n");
- printf("Copilul 2 a primit de la parinte : ");
- while(read(pfd2[0],am_citit,1))
- {
- printf("%s",am_citit);
- statistica[atoi(am_citit)]++;
- }
- printf("\n");
- for(int i=0;i<10;i++)
- {
- printf("Statistic vorbind cifra %d a aparut de %d ori \n",i,statistica[i]);
- }
- exit(2);
- }
- else // funcitonalitate parinte
- {
- close(pfd1[0]); //parintele nu citeste din primul pipe
- close(pfd2[0]); //parintele nu citeste din al doilea pipe
- close(pfd2[1]); //parintele nu scrie in al doilea pipe
- close(pfd3[0]); //parintele nu scrie in al treilea pipe
- int wbuf=sprintf(writebuff,"Mama nu are mere lul 1 2 8 3 8 4 5 6 7 8 8 8 2 3 2 3 3 4 2");
- write(pfd1[1],writebuff,wbuf);
- close(pfd1[1]);// am terminat de scris catre copilul 1
- for(int i=0;i<2;i++)
- {
- child_pid = wait(&status);
- printf("Child with pid: %d ended with code %d\n",child_pid, WEXITSTATUS(status));
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement