Facebook
From Chunky Hog, 6 Years ago, written in C++.
Embed
Download Paste or View Raw
Hits: 257
  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <sys/stat.h>
  4. #include <errno.h>
  5. #include <fcntl.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #define db 0
  9.  
  10. void debug(int desc, char * tekst, char * pid)  {
  11.     char *MSG = (char *) malloc((2 + strlen(pid) + strlen(tekst)));
  12.     strcpy(MSG, pid);
  13.     strcat(MSG, "\n");
  14.     strcat(MSG, tekst);
  15.     write(desc, MSG, (int)strlen(MSG));
  16. }
  17.  
  18. int main(int argc, char *argv[]) {
  19.     int writer_number = atoi(argv[1]);
  20.  
  21.     pid_t parent = getppid();
  22.     char parent_str[20];
  23.     sprintf(parent_str, "%d", parent);
  24.  
  25.     pid_t pid = getpid();
  26.     char pid_str[20];
  27.     sprintf(pid_str, "%d", pid);
  28.  
  29.     int inst;
  30.     if(db == 1) inst = open("test.txt", O_CREAT | O_WRONLY | O_APPEND , S_IRUSR | S_IWUSR);
  31.  
  32.     int fd;
  33.  
  34.     if ((mkfifo(parent_str, S_IRWXU | S_IRWXG | S_IRWXO)) != 0) {
  35.         if (errno == EEXIST) {
  36.             if(db == 1) debug(inst, "  WRITER. Fifo DUZE juz stworzone. Otwieram do odczytu.\n", pid_str);
  37.             if ((fd = open(parent_str, O_WRONLY|O_APPEND)) == -1) exit(1);
  38.         } else {
  39.             exit(1);
  40.         }
  41.     } else {
  42.         if(db == 1) debug(inst, "  WRITER. Fifo DUZE nie stworzone. Tworzę i otwieram do odczytu.\n", pid_str);
  43.         if ((fd = open(parent_str, O_WRONLY|O_APPEND)) == -1) exit(1);
  44.     }
  45.  
  46.     int wd;
  47.     int special = 0;
  48.  
  49.     char writer_parent_str[20];
  50.     sprintf(writer_parent_str, "%d", parent);
  51.     writer_parent_str[strlen(writer_parent_str) + 1] = writer_parent_str[strlen(writer_parent_str)];
  52.     writer_parent_str[strlen(writer_parent_str)] = 'W';
  53.  
  54.     if ((mkfifo(writer_parent_str, S_IRWXU | S_IRWXG | S_IRWXO)) != 0) {
  55.         if (errno == EEXIST) {
  56.             if(db == 1) debug(inst, "  WRITER. Nie zostane specjalnym writerem.\n", pid_str);
  57.             if ((wd = open(writer_parent_str, O_WRONLY|O_APPEND)) == -1) exit(1);
  58.             special = 0;
  59.         } else {
  60.             exit(1);
  61.         }
  62.     } else {
  63.         if(db == 1) debug(inst, "  WRITER. Zostalem specjalnym writerem.\n", pid_str);
  64.         if ((wd = open(writer_parent_str, O_RDONLY)) == -1) exit(1);
  65.         special = 1;
  66.     }
  67.  
  68.     int val;
  69.     char buf[20];
  70.  
  71.     fd_set readfds;
  72.     int ok_3 = 1;
  73.     int ok_4 = 1;
  74.  
  75.     if(db == 1) debug(inst, "  WRITER. Zaczynam produkcje liczb.\n", pid_str);
  76.  
  77.     while(ok_3 == 1 || ok_4 == 1) {
  78.         FD_ZERO(&readfds);
  79.         if(ok_3) FD_SET(3, &readfds);
  80.         if(ok_4) FD_SET(4, &readfds);
  81.  
  82.         int ready_for_reading = select(5, &readfds, NULL, NULL, NULL);
  83.  
  84.         if(ready_for_reading) {
  85.             if (FD_ISSET(3, &readfds)) {
  86.                 if (read(3, &val, 4) > 0) {
  87.                     int i;
  88.                     int n = sprintf(buf, "%d", val);
  89.                     for (i = n; i < 20; i++) buf[i] = ' ';
  90.                     buf[19] = '\n';
  91.                     if (n > 0) write(fd, buf, 20);
  92.                 } else {
  93.                     ok_3 = 0;
  94.                     if(db == 1) debug(inst, "  WRITER. Trojka skonczyla prace.\n", pid_str);
  95.                 }
  96.             }
  97.             if (FD_ISSET(4, &readfds)) {
  98.                 if (read(4, &val, 4) > 0) {
  99.                     int i;
  100.                     int n = sprintf(buf, "%d", val);
  101.                     for (i = n; i < 20; i++) buf[i] = ' ';
  102.                     buf[19] = '\n';
  103.                     if (n > 0) write(fd, buf, 20);
  104.                 } else {
  105.                     ok_4 = 0;
  106.                     if(db == 1) debug(inst, "  WRITER. Czworka skonczyla prace.\n", pid_str);
  107.                 }
  108.             }
  109.         }
  110.     }
  111.  
  112.     if(db == 1) debug(inst, "  WRITER. Wgl producenci skonczyli produkcje.\n", pid_str);
  113.  
  114.     if(special == 0) {
  115.         write(wd, "1", 1);
  116.         if(db == 1) debug(inst, "  WRITER. Nie jestem specjalny wiec zapisuje jedynke.\n", pid_str);
  117.     } else {
  118.         int count = 0;
  119.         char buff[2];
  120.         buff[1] = '\n';
  121.         if(db == 1) debug(inst, "  WRITER. Jestem specjalny czekam na reszte.\n", pid_str);
  122.         while(count != writer_number - 1){
  123.             buff[0] = '0';
  124.             if(read(wd, &buff, 1) > 0) {
  125.                 if (buff[0] == '1') {
  126.                     if(db == 1) debug(inst, "  WRITER. Ktos zakonczyl i sie odrejestrowal.\n", pid_str);
  127.                     count++;
  128.                 }
  129.             }
  130.         }
  131.  
  132.         if(db == 1) debug(inst, "  WRITER. Wszyscy skonczyli.\n", pid_str);
  133.  
  134.         char del[100];
  135.         del[0] = 'r';
  136.         del[1] = 'm';
  137.         del[2] = ' ';
  138.         int i = 3, k = 0;
  139.         for(k = 0; k < strlen(parent_str); k++, i++) {
  140.             del[i] = parent_str[k];
  141.         }
  142.         del[i++] = ' ';
  143.         for(k = 0; k < strlen(writer_parent_str); k++, i++) {
  144.             del[i] = writer_parent_str[k];
  145.         }
  146.         system(del);
  147.  
  148.         if(db == 1) debug(inst, "  WRITER. Posprzatalem, koncze robote.\n", pid_str);
  149.     }
  150.  
  151.     if(db == 1) close(inst);
  152.     close(fd);
  153.     close(wd);
  154.     close(3);
  155.     close(4);
  156.  
  157.     return 0;
  158. }
  159.