Advertisement
Guest User

fwefew

a guest
Jan 20th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.28 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <stdlib.h>
  4. #include <signal.h>
  5. #include <sys/sem.h>
  6. #include <sys/select.h>
  7. #include <sys/types.h>
  8. #include <string.h>
  9.  
  10. #define BUFLENGTH 256
  11.  
  12. struct bufor
  13. {
  14.    char bufor[BUFLENGTH];
  15.    size_t wynik[BUFLENGTH];
  16.    int j;
  17.    int menu;
  18. };
  19. struct bufor *buf;
  20.  
  21. struct komunikat
  22. {
  23.  long typ;
  24. };
  25. struct komunikat kom;
  26.  
  27. char o[20];
  28.  
  29. union semun //unia dla danych semafora
  30. {
  31. int val;
  32. struct semid_ds *buf;
  33. ushort *array;
  34. }arg;
  35.  
  36.  
  37. struct sembuf signal_buf;
  38. struct sembuf wait_buf;
  39.  
  40. key_t  PD=5, p1=1, p2=2, p3=3, p4=4;; //klucze dla semaforów
  41. int semBuf, sem1 ,sem2, sem3, sem4 = 0;
  42. static volatile sig_atomic_t pauseflag = 0;
  43.  int komlen = sizeof(struct komunikat);
  44. int id_kolejki;
  45.  int mask;
  46.  key_t msgkey;
  47.  
  48.  
  49. int initSem(key_t semKey, int value) { //funkcja inicjuj1ca semafor o kluczu semKey i warto?ci value
  50.  int semID;
  51.  semID = semget(semKey, 1, IPC_CREAT | 0666); // tworzy semafor
  52.  arg.val = value; //przypisuje warto?a do zmiennej z unii
  53.  semctl(semID, 0, SETVAL, arg); // ustawia warto?a pocz1tkow1
  54.  return semID;
  55.  
  56. }
  57.  
  58.  
  59. int destroySem(int semID) { //funkcja niszczaca semafor semID
  60.  semctl(semID, 0, IPC_RMID);
  61.  return 0;
  62. }
  63.  
  64.  
  65. int waitSem(int semID) { //funkcja opuszczajaca semafor id
  66.  wait_buf.sem_num = 0; //ustawia numer semafora
  67.  wait_buf.sem_op = -1; //pobranie zasobów
  68.  semop(semID, &wait_buf, 1); //wykonanie operacji na semaforze
  69.  return 0;
  70. }
  71.  
  72.  
  73. int signalSem(int semID) { //funkcja podnoszaca semafor id
  74.  signal_buf.sem_num = 0; //ustawienie numeru semafora w zbiorze
  75.  signal_buf.sem_op = 1; //zwolnienie zasobów
  76.  semop(semID, &signal_buf, 1); //wykonanie operacji na semaforze
  77.  return 0;
  78. }
  79.  
  80.  
  81. static int *getSHM(void) { // funkcja pobierajaca adres pamieci wspoldzielonej
  82.  int shmid, *p;
  83.  shmid = shmget (PD, 512, IPC_CREAT | 0666); //pobiera id pamieci wspó3dzielonej
  84.  p = (int*)shmat(shmid, NULL, 0); //pobiera adres pamieci wspoldzielonej o id shmid
  85.  return p;
  86. }
  87.  
  88.  
  89. FILE *plik;
  90. int tryb=0;
  91. int co=0;
  92.  
  93.  
  94. void ClrScr(){
  95.   printf("\033[2J"); // Czysci ekran
  96.   printf("\033[0;0f"); // Ustawia kursor w lewym, górnym rogu
  97. }
  98.  
  99.  
  100.  
  101. void menu(){
  102. printf("::::MENU::::\n");
  103. printf("1. Ze standardowego wejscia\n");
  104. printf("2. Z pliku\n");
  105. scanf("%d",&tryb);
  106. int c;
  107. while ((c = getchar()) != '\n' && c != EOF); //czyszczenie stdin
  108. switch(tryb){
  109.  
  110. case 1:
  111.     printf("Wybrales tryb 1, napisz cos\n");
  112.     break;
  113.  
  114. case 2:
  115.     printf("Wybrales tryb 2, podaj nazwe pliku\n");
  116.     scanf("%s", o);
  117.     break;
  118.  
  119. default:
  120.     ClrScr();
  121.     menu();
  122.     break; 
  123.  
  124. }
  125.  
  126. }
  127.  
  128. void delay (int x){
  129. int i=0;
  130. while(i<x)
  131. i++;
  132. }
  133.  
  134. void proc1() {
  135.     waitSem(sem1); //zamyka p1
  136.     int c;
  137.     if(tryb==0)menu();
  138.     printf("p1 %d \n",getpid());
  139.      if(tryb==1){
  140.      co=1;
  141.      printf("(P1) Podaj wiersz\n");
  142.     // memset(buf->bufor, 0, sizeof(buf->bufor));
  143.      fgets(buf->bufor,512, stdin);
  144.      if((char)buf->bufor[0] != '.'){
  145.      signalSem(sem2);
  146.     }
  147.      else{
  148.     tryb=0;
  149.     signalSem(sem1);
  150.  
  151.     }
  152.         }
  153.  /* else if(tryb==2){
  154.     memset(buf->bufor, 0, sizeof(buf->bufor));
  155.     plik=fopen(o, "r");
  156.         while(fgets(buf->bufor,512,plik)!=NULL)
  157.        {
  158.             printf("%s", buf->bufor);
  159.     signalSem(sem2);
  160.     }  
  161.     rewind(plik);
  162.     fclose(plik);
  163.      signalSem(sem3);
  164.     sleep(1);
  165.     menu();
  166.     }      
  167.     else ClrScr();*/
  168. }
  169.  
  170.  
  171. void proc2() {
  172.     waitSem(sem2);
  173. printf("p2 %d \n",getpid());
  174.     printf("(P2) Odebrano: %s", buf->bufor);
  175.     size_t l = strlen(buf->bufor) - 1;
  176.     printf("(P2) Obliczono: %d\n", l);
  177.     memset(buf->bufor, 0, sizeof(buf->bufor));
  178.     buf->wynik[buf->j] = l;
  179.     buf->j++;
  180.     if(tryb!=2)
  181.     signalSem(sem3);
  182. }
  183.  
  184.  
  185. void proc3() {
  186.     waitSem(sem3);
  187.     int i;
  188.     for(i=0; i<buf->j; i++)
  189.     if(buf->wynik[i] != -1)
  190.     printf("(P3) Liczba znakow w wierszu: %d.\n", buf->wynik[i]);
  191.     buf->j = 0;
  192.     buf->menu = 0;
  193.     signalSem(sem1);
  194. }
  195.  
  196.  
  197.  
  198. void mypause() {
  199.     pauseflag = 0;
  200.     while(!pauseflag){ }
  201. }
  202.  
  203. void mycont() {
  204.     pauseflag = 1;
  205. }
  206.  
  207.  
  208. void handl(int signum) {
  209.     kom.typ = 1;
  210.     msgsnd(id_kolejki, &kom, komlen, 0);
  211.     msgsnd(id_kolejki, &kom, komlen, 0);
  212.     kill(getpid()+1, SIGUSR1);
  213. }
  214.  
  215. void handl1(int signum) {
  216.     kom.typ = 2;
  217.     msgsnd(id_kolejki, &kom, komlen, 0);
  218.     msgsnd(id_kolejki, &kom, komlen, 0);
  219.     kill(getpid()+1, SIGUSR1);
  220. }
  221.  
  222. void handl2(int signum) {
  223.     msgrcv(id_kolejki, &kom, komlen, mask, 0);
  224.     kill(getpid()+1, SIGUSR1);
  225.     if(kom.typ == 1) {
  226.         printf("Odebralem %d", kom.typ);
  227.         }
  228.     if(kom.typ == 2) {
  229.         printf("Odebralem %d", kom.typ);
  230.         }
  231.    
  232. }
  233.   pid_t id;
  234.   pid_t id2;
  235.   pid_t id3;
  236.  
  237. void mhandl(int signum) {
  238.     kill(getpid()+1, SIGTSTP);
  239. }
  240.  
  241. void m2handl(int signum) {
  242.     kill(getppid(), SIGUSR1);
  243. }
  244. void tstphandler(int signum) {
  245.     kill(getppid(), SIGUSR1);
  246. }
  247.  
  248. void conthandler(int signum) {
  249.     kill(getppid(), SIGUSR2);
  250. }
  251.  
  252. void mtstphandler(int signum) {
  253.     kill(getpid()+1, SIGUSR1);
  254. }
  255.  
  256. void mconthandler(int signum) {
  257.     kill(getpid()+1, SIGUSR2);
  258. }
  259.  
  260. void ptstphandler(int signum) {
  261.     kill(getpid()+1, SIGUSR1);
  262.     mypause();
  263. }
  264.  
  265. void pconthandler(int signum) {
  266.     kill(getpid()+1, SIGUSR2);
  267.     mycont();
  268. }
  269.  
  270. int main(){
  271.  
  272.  int tryb;
  273.  sem1 = initSem(p1, 1); //proces 1 otwarty
  274.  sem2 = initSem(p2, 0);
  275.  sem3 = initSem(p3, 0); //procesy 2, 3 zamkniete
  276.  buf = (struct bufor*)getSHM(); //adres shm
  277.  buf->j = 0;
  278.  buf->menu = 0;
  279.  
  280.  sigset_t mask;
  281.  sigset_t orig_mask;
  282.  struct sigaction act;
  283.  sigfillset(&mask);
  284.  sigdelset(&mask, SIGTSTP);
  285.  sigdelset(&mask, SIGCONT);
  286.  sigdelset(&mask, SIGTERM);
  287.  sigdelset(&mask, SIGUSR1);
  288.  sigdelset(&mask, SIGUSR2);
  289.  sigdelset(&mask, SIGQUIT);
  290.  sigprocmask(SIG_BLOCK, &mask, NULL);
  291.  
  292.  
  293.  msgkey = ftok(".", 'm');
  294.  id_kolejki = msgget(msgkey, IPC_CREAT | 0660);
  295.  
  296.  if(id=fork()==0) {
  297.     while(1)
  298.     {  
  299.         signal(SIGUSR1, ptstphandler);
  300.         signal(SIGUSR2, pconthandler);
  301.         proc1();
  302.  
  303.     }
  304.  
  305.         shmdt((char*)buf);
  306.     exit(0);  
  307.  
  308.  }  
  309.  
  310.  else if(id2=fork()==0) {
  311.     while(1)
  312.     {
  313.         signal(SIGUSR1, ptstphandler);
  314.         signal(SIGUSR2, pconthandler);
  315.         signal(SIGTSTP, tstphandler);
  316.         signal(SIGCONT, conthandler);
  317.         proc2();
  318.     }
  319.     shmdt((char*)buf);
  320.     exit(0);                
  321.  }
  322.  
  323.  else if(id3=fork()==0) {
  324.     while(1)
  325.     {
  326.         signal(SIGUSR1, mypause);
  327.         signal(SIGUSR2, mycont);
  328.         proc3();
  329.     }
  330.  
  331.     shmdt((char*)buf);
  332.     exit(0);
  333.  
  334.  }
  335.  
  336.  
  337. else
  338. while(1){
  339.       signal(SIGUSR1, mtstphandler);
  340.       signal(SIGUSR2, mconthandler);
  341.  
  342.  
  343. }
  344.  
  345.  
  346. wait();
  347. wait();
  348. wait();
  349.  
  350. return 0;
  351.  
  352. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement