Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <unistd.h>
- #include <stdlib.h>
- #include <signal.h>
- #include <sys/sem.h>
- #include <sys/select.h>
- #include <sys/types.h>
- #include <string.h>
- #define BUFLENGTH 256
- struct bufor
- {
- char bufor[BUFLENGTH];
- size_t wynik[BUFLENGTH];
- int j;
- int menu;
- };
- struct bufor *buf;
- struct komunikat
- {
- long typ;
- };
- struct komunikat kom;
- char o[20];
- union semun //unia dla danych semafora
- {
- int val;
- struct semid_ds *buf;
- ushort *array;
- }arg;
- struct sembuf signal_buf;
- struct sembuf wait_buf;
- key_t PD=5, p1=1, p2=2, p3=3, p4=4;; //klucze dla semaforów
- int semBuf, sem1 ,sem2, sem3, sem4 = 0;
- static volatile sig_atomic_t pauseflag = 0;
- int komlen = sizeof(struct komunikat);
- int id_kolejki;
- int mask;
- key_t msgkey;
- int initSem(key_t semKey, int value) { //funkcja inicjuj1ca semafor o kluczu semKey i warto?ci value
- int semID;
- semID = semget(semKey, 1, IPC_CREAT | 0666); // tworzy semafor
- arg.val = value; //przypisuje warto?a do zmiennej z unii
- semctl(semID, 0, SETVAL, arg); // ustawia warto?a pocz1tkow1
- return semID;
- }
- int destroySem(int semID) { //funkcja niszczaca semafor semID
- semctl(semID, 0, IPC_RMID);
- return 0;
- }
- int waitSem(int semID) { //funkcja opuszczajaca semafor id
- wait_buf.sem_num = 0; //ustawia numer semafora
- wait_buf.sem_op = -1; //pobranie zasobów
- semop(semID, &wait_buf, 1); //wykonanie operacji na semaforze
- return 0;
- }
- int signalSem(int semID) { //funkcja podnoszaca semafor id
- signal_buf.sem_num = 0; //ustawienie numeru semafora w zbiorze
- signal_buf.sem_op = 1; //zwolnienie zasobów
- semop(semID, &signal_buf, 1); //wykonanie operacji na semaforze
- return 0;
- }
- static int *getSHM(void) { // funkcja pobierajaca adres pamieci wspoldzielonej
- int shmid, *p;
- shmid = shmget (PD, 512, IPC_CREAT | 0666); //pobiera id pamieci wspó3dzielonej
- p = (int*)shmat(shmid, NULL, 0); //pobiera adres pamieci wspoldzielonej o id shmid
- return p;
- }
- FILE *plik;
- int tryb=0;
- int co=0;
- void ClrScr(){
- printf("\033[2J"); // Czysci ekran
- printf("\033[0;0f"); // Ustawia kursor w lewym, górnym rogu
- }
- void menu(){
- printf("::::MENU::::\n");
- printf("1. Ze standardowego wejscia\n");
- printf("2. Z pliku\n");
- scanf("%d",&tryb);
- int c;
- while ((c = getchar()) != '\n' && c != EOF); //czyszczenie stdin
- switch(tryb){
- case 1:
- printf("Wybrales tryb 1, napisz cos\n");
- break;
- case 2:
- printf("Wybrales tryb 2, podaj nazwe pliku\n");
- scanf("%s", o);
- break;
- default:
- ClrScr();
- menu();
- break;
- }
- }
- void delay (int x){
- int i=0;
- while(i<x)
- i++;
- }
- void proc1() {
- waitSem(sem1); //zamyka p1
- int c;
- if(tryb==0)menu();
- printf("p1 %d \n",getpid());
- if(tryb==1){
- co=1;
- printf("(P1) Podaj wiersz\n");
- // memset(buf->bufor, 0, sizeof(buf->bufor));
- fgets(buf->bufor,512, stdin);
- if((char)buf->bufor[0] != '.'){
- signalSem(sem2);
- }
- else{
- tryb=0;
- signalSem(sem1);
- }
- }
- /* else if(tryb==2){
- memset(buf->bufor, 0, sizeof(buf->bufor));
- plik=fopen(o, "r");
- while(fgets(buf->bufor,512,plik)!=NULL)
- {
- printf("%s", buf->bufor);
- signalSem(sem2);
- }
- rewind(plik);
- fclose(plik);
- signalSem(sem3);
- sleep(1);
- menu();
- }
- else ClrScr();*/
- }
- void proc2() {
- waitSem(sem2);
- printf("p2 %d \n",getpid());
- printf("(P2) Odebrano: %s", buf->bufor);
- size_t l = strlen(buf->bufor) - 1;
- printf("(P2) Obliczono: %d\n", l);
- memset(buf->bufor, 0, sizeof(buf->bufor));
- buf->wynik[buf->j] = l;
- buf->j++;
- if(tryb!=2)
- signalSem(sem3);
- }
- void proc3() {
- waitSem(sem3);
- int i;
- for(i=0; i<buf->j; i++)
- if(buf->wynik[i] != -1)
- printf("(P3) Liczba znakow w wierszu: %d.\n", buf->wynik[i]);
- buf->j = 0;
- buf->menu = 0;
- signalSem(sem1);
- }
- void mypause() {
- pauseflag = 0;
- while(!pauseflag){ }
- }
- void mycont() {
- pauseflag = 1;
- }
- void handl(int signum) {
- kom.typ = 1;
- msgsnd(id_kolejki, &kom, komlen, 0);
- msgsnd(id_kolejki, &kom, komlen, 0);
- kill(getpid()+1, SIGUSR1);
- }
- void handl1(int signum) {
- kom.typ = 2;
- msgsnd(id_kolejki, &kom, komlen, 0);
- msgsnd(id_kolejki, &kom, komlen, 0);
- kill(getpid()+1, SIGUSR1);
- }
- void handl2(int signum) {
- msgrcv(id_kolejki, &kom, komlen, mask, 0);
- kill(getpid()+1, SIGUSR1);
- if(kom.typ == 1) {
- printf("Odebralem %d", kom.typ);
- }
- if(kom.typ == 2) {
- printf("Odebralem %d", kom.typ);
- }
- }
- pid_t id;
- pid_t id2;
- pid_t id3;
- void mhandl(int signum) {
- kill(getpid()+1, SIGTSTP);
- }
- void m2handl(int signum) {
- kill(getppid(), SIGUSR1);
- }
- void tstphandler(int signum) {
- kill(getppid(), SIGUSR1);
- }
- void conthandler(int signum) {
- kill(getppid(), SIGUSR2);
- }
- void mtstphandler(int signum) {
- kill(getpid()+1, SIGUSR1);
- }
- void mconthandler(int signum) {
- kill(getpid()+1, SIGUSR2);
- }
- void ptstphandler(int signum) {
- kill(getpid()+1, SIGUSR1);
- mypause();
- }
- void pconthandler(int signum) {
- kill(getpid()+1, SIGUSR2);
- mycont();
- }
- int main(){
- int tryb;
- sem1 = initSem(p1, 1); //proces 1 otwarty
- sem2 = initSem(p2, 0);
- sem3 = initSem(p3, 0); //procesy 2, 3 zamkniete
- buf = (struct bufor*)getSHM(); //adres shm
- buf->j = 0;
- buf->menu = 0;
- sigset_t mask;
- sigset_t orig_mask;
- struct sigaction act;
- sigfillset(&mask);
- sigdelset(&mask, SIGTSTP);
- sigdelset(&mask, SIGCONT);
- sigdelset(&mask, SIGTERM);
- sigdelset(&mask, SIGUSR1);
- sigdelset(&mask, SIGUSR2);
- sigdelset(&mask, SIGQUIT);
- sigprocmask(SIG_BLOCK, &mask, NULL);
- msgkey = ftok(".", 'm');
- id_kolejki = msgget(msgkey, IPC_CREAT | 0660);
- if(id=fork()==0) {
- while(1)
- {
- signal(SIGUSR1, ptstphandler);
- signal(SIGUSR2, pconthandler);
- proc1();
- }
- shmdt((char*)buf);
- exit(0);
- }
- else if(id2=fork()==0) {
- while(1)
- {
- signal(SIGUSR1, ptstphandler);
- signal(SIGUSR2, pconthandler);
- signal(SIGTSTP, tstphandler);
- signal(SIGCONT, conthandler);
- proc2();
- }
- shmdt((char*)buf);
- exit(0);
- }
- else if(id3=fork()==0) {
- while(1)
- {
- signal(SIGUSR1, mypause);
- signal(SIGUSR2, mycont);
- proc3();
- }
- shmdt((char*)buf);
- exit(0);
- }
- else
- while(1){
- signal(SIGUSR1, mtstphandler);
- signal(SIGUSR2, mconthandler);
- }
- wait();
- wait();
- wait();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement