Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*******************************************************************************************************
- Scop: testarea abilitatii de a scrie un program in limbajul C, folosind API-ul POSIX, ce rezolva o problema data.
- Enunt a treia problema:
- Sa se scrie un program C care va crea doua procese fii si va implementa urmatoarea functionalitate:
- Procesul tata va citi de la tastatura o propozitie, pe care o va transmite primului fiu.
- Primul fiu va elimina toate vocalele si va transmite textul obtinut astfel catre fiul al doilea.
- Al doilea fiu va procesa textul primit transformand toate literele mici in litere mari, iar rezultatul
- il va trimite catre tata.
- Tatal va afisa pe ecran textul prelucrat primit de la al doiela fiu.
- Pentru comunicarea intre procese veti folosi canale anonime (pipe-uri).
- NOTA: pastrati enuntul in acest comentariu si scrieti rezolvarea mai jos.
- *******************************************************************************************************/
- #include <unistd.h>
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/wait.h>
- #include <stdlib.h>
- #include <string.h>
- #include <time.h>
- #include <string.h>
- //T : text
- //F1: text fara voc
- //F2: text litere mari
- //T : afis(text)
- int main(){
- pid_t pid1, pid2;
- int pipe0To1[2];
- int pipe1To2[2];
- int pipe2To0[2];
- //Verificam creerea corecta a pipe-urile
- if (pipe(pipe0To1) == -1){
- exit(1);
- }
- if (pipe(pipe1To2) == -1){
- exit(1);
- }
- if (pipe(pipe2To0) == -1){
- exit(1);
- }
- //Verificam creerea primului copil
- if ((pid1 = fork()) == -1){
- exit(2);
- }
- if (pid1 == 0){
- //Child1
- //Inchidem pipe-urile ne-necesare
- close(pipe0To1[1]);
- close(pipe1To2[0]);
- close(pipe2To0[0]);
- close(pipe2To0[1]);
- char c;
- while(read(pipe0To1[0], &c, 1)){
- //Verificam daca e vocala
- if (!strchr("aeiouAEIOU", c)){
- //Trimitem la fiu2
- write(pipe1To2[1], &c, 1);
- }
- }
- close(pipe0To1[0]);
- close(pipe1To2[1]);
- }
- else{
- if ((pid2 = fork()) == -1){
- exit(2);
- }
- if (pid2 == 0){
- //Child2;
- //Inchidem pipe-urile ne-necesare
- close(pipe1To2[1]);
- close(pipe2To0[0]);
- close(pipe0To1[0]);
- close(pipe0To1[1]);
- char c;
- while(read(pipe1To2[0], &c, 1)){
- //Verificam daca e litera mica
- if (c >= 'a' && c <= 'z'){
- //Tranformam in litera mare
- c -= 'a' - 'A';
- }
- //Trimitem la tata
- write(pipe2To0[1], &c, 1);
- }
- //Inchidem pipe-urile folosite
- close(pipe1To2[0]);
- close(pipe2To0[1]);
- }
- else{
- //Father;
- //Inchidem pipe-urile ne-necesare
- close(pipe0To1[0]);
- close(pipe2To0[1]);
- close(pipe1To2[0]);
- close(pipe1To2[1]);
- char c;
- while((c = getchar()) != EOF){
- //Trimitem la fiu1
- write(pipe0To1[1], &c, 1);
- }
- //Inchidem pipe-urile folosite
- close(pipe0To1[1]);
- //Ne asiguram ca fii si-au terminat treaba
- wait(NULL);
- //Afisam textul
- while(read(pipe2To0[0], &c, 1)){
- printf("%c", c);
- }
- //Inchidem pipe-urile folosite
- close(pipe2To0[0]);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement