Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <sys/sem.h>
- #include <sys/shm.h>
- #include <signal.h>
- #include <sys/wait.h>
- #include <unistd.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <sys/msg.h>
- int pidy[3] = {0, 0, 0}; // Pidy P1 , P2 , P3
- int P1doP2[2]; // pipe'y do komunikacji
- int P2doP3[2]; // pipe'y do komunikacji
- int Queue; // kolejka do wysylania sygnalow
- int czykoniecpliku =1;
- int stop = 0; // Zmienna odpowiadajaca za wymiane dane
- FILE *fp;
- #define idKolejki 50 // Klucz id dla kolejki
- typedef struct msgbuf{ // struktura kolejki - typ wiadomosci, tresc
- long typ;
- int tresc;
- } w;
- int sem_utworz(int keynb){
- key_t semkey = ftok(".", keynb);
- int semid = semget(semkey, 1, IPC_CREAT | 0666);
- return semid;
- }
- void sem_usun(int semid){
- semctl(semid, 0, IPC_RMID);
- }
- void sem_podnies(int semid){
- struct sembuf podnies = { 0, 1, 0 };
- semop(semid, &podnies, 1);
- }
- void sem_opusc(int semid){
- struct sembuf opusc = { 0, -1, 0 };
- semop(semid, &opusc, 1);
- }
- void piszdokolejki(int tresc) // Funkcja piszaca do kolejki
- {
- w wiad;
- wiad.typ = 1;
- wiad.tresc = tresc; // Nr sygnalu lub PID ktory na poczatku dzialania wysyla matka
- msgsnd(Queue, &wiad, 1, IPC_NOWAIT);
- }
- void odczytajzkolejki() // ODczytaj z kolejki swoja wiadomosc
- {
- w wiad;
- msgrcv(Queue, &wiad, sizeof(wiad.tresc), 1, 0);
- //return wiad.tresc;
- }
- void proces1()
- {
- char wiadomosc[128]; // Tu zapiszemy nasza wiadomosc w postaci liczb.
- int i = 0;
- while(czykoniecpliku)
- {
- for(i = 0; i < 128; i++)
- wiadomosc[i] = 0;
- // fgets pracuje do odczytania 32 znakow lub trafienia na '\n'
- if(fgets(wiadomosc, 128, stdin) == NULL) // jesli fgets zwrocil NULL tzn ze plik sie skonczyl
- czykoniecpliku = 0;
- if(czykoniecpliku) // Jesli plik sie nie skonczyl
- write(P1doP2[1], wiadomosc, sizeof(wiadomosc)); // Wyslij paczke do P2
- while(stop); // Jak wstrzymamy procesy sygnalem to tu sie zatrzymaja
- }
- // Jesli wyszlismy z petli tzn, ze plik sie skonczyl. Wysylac -1 poinformujemy o tym reszte
- wiadomosc[0] = -1;
- write(P1doP2[1], wiadomosc, sizeof(wiadomosc));
- }
- void proces2()
- {
- int semid1 = sem_utworz(0);
- int semid2 = sem_utworz(1);
- char wiadomosc[128];
- while(czykoniecpliku)
- {
- read(P1doP2[0], wiadomosc, sizeof(wiadomosc)); //Odczytaj to co wyslal P1
- if(wiadomosc[0] == -1) // Sprawdz czy to koniec
- czykoniecpliku = 0;
- //int liczbabajtow = strlen(wiadomosc);
- //fprintf(stderr, "%d\n", liczbabajtow);
- sem_podnies(semid1);
- fp=fopen("test.txt", "w");
- fprintf (fp, "%s", wiadomosc);
- fclose (fp);
- sem_opusc(semid2);
- //printf("%s",wiadomosc);
- //write(P2doP3[1], wiadomosc, sizeof(wiadomosc)); // Wyslij pake do P3
- while(stop);
- }
- wiadomosc[0] = -1;
- sem_podnies(semid1);
- fp=fopen("test.txt", "w");
- fprintf (fp, "%s", wiadomosc);
- fclose (fp);
- sem_opusc(semid2);
- //write(P2doP3[1], wiadomosc, sizeof(wiadomosc));
- //printf("%s",wiadomosc);
- }
- void proces3()
- {
- int semid1 = sem_utworz(0);
- int semid2 = sem_utworz(1);
- char wiadomosc[128];
- pidy[2] = getpid();
- while(czykoniecpliku)
- {
- //read(P2doP3[0], wiadomosc, sizeof(wiadomosc));
- sem_podnies(semid2);
- fp=fopen("test.txt", "r");
- fgets(wiadomosc, 128, fp);
- fclose (fp);
- sem_opusc(semid1);
- printf("%s",wiadomosc);
- if(wiadomosc[0] == -1)
- czykoniecpliku = 0;
- while(stop);
- }
- printf("%s",wiadomosc);
- }
- int main(void){
- pipe(P1doP2); // TWorzymy rury, kolejke komunikatow
- pipe(P2doP3);
- Queue = msgget(idKolejki, 0666 | IPC_CREAT);
- int semid1 = sem_utworz(0);
- int semid2 = sem_utworz(1);
- semctl(semid1, 0, SETVAL, 0);
- if((pidy[2] = fork()) == 0) // P3
- {
- pidy[2] = getpid();
- proces3();
- return 0;
- }
- if((pidy[1] = fork()) == 0) // P2
- {
- pidy[1] = getpid();
- proces2();
- return 0;
- }
- if((pidy[0] = fork()) == 0) // P1
- {
- pidy[0] = getpid();
- proces1();
- return 0;
- }
- //Czekamy na zakonczenie działania forków
- waitpid(pidy[2], NULL, 0);
- waitpid(pidy[1], NULL, 0);
- waitpid(pidy[0], NULL, 0);
- printf("\nProcesy - forki zakonczyly prace");
- //Usuwamy kolejkę , pipe'y
- msgctl(Queue, IPC_RMID, NULL);
- close(P1doP2[0]);
- close(P1doP2[1]);
- close(P2doP3[0]);
- close(P2doP3[1]);
- semctl(semid1, 0, IPC_RMID);
- semctl(semid2, 1, IPC_RMID);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement