Advertisement
Guest User

Untitled

a guest
Jan 24th, 2018
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.41 KB | None | 0 0
  1. // INFORMACJE Z INTERNETU:
  2. // If O_NONBLOCK is set, an open() for reading-only shall return without delay.
  3. // An open() for writing-only shall return an error if no process currently has the file open for reading.
  4. // EBADF Ost odczyt Koniec danych po zamnknieciu
  5.  
  6.  
  7. #include <stdio.h>
  8. #include <unistd.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <sys/types.h>
  12. #include <fcntl.h>
  13. #include <errno.h>
  14. #include <sys/wait.h>
  15.  
  16. // ./konsument [ilosc konsumentow]
  17.  
  18. ////////////// ZMIENNE GLOBALNE ///////////////////
  19.  
  20. int pid;
  21. int potok;
  22. int liczbaKonsumentow;
  23.  
  24. unsigned int limitProcesow;
  25. char limitProcesowUzytkownika[10];
  26. char uruchomioneProcesyUzytkownika[10];
  27. FILE *limitFile;
  28.  
  29. FILE *fp;
  30. char sciezkaPliku[50] = "./konsumenci/";
  31. char charpid[10];
  32. char znak;
  33. char bufor;
  34.  
  35. //////////////////////////////// MAIN ////////////////////////////////
  36. int main(int argc, char *argv[]) {
  37.  
  38.     //# PORZĄDKOWANIE ARGUMENTÓW:
  39.     if (argc != 2) {
  40.         printf("ERROR KONSUMENT: Nieprawidlowa liczba argumentow\n");
  41.         exit(1);
  42.     }
  43.  
  44.     if (argv[1] <= 0){
  45.         printf("ERROR: Liczba Konsumentów powinna być liczbą dodatnią\n");
  46.         exit(-1);
  47.     }
  48.  
  49.     liczbaKonsumentow = atoi(argv[1]);
  50.  
  51.     //# LIMIT PROCESÓW UŻYTKOWNIKA:
  52.     if (system("./limity.sh") == -1) {
  53.         printf("ERROR: Błąd zbierania informacji o limitach!\n");
  54.         exit(-1);
  55.     }
  56.  
  57.     limitFile = fopen("limity.txt", "r");
  58.     if (limitFile == NULL) {
  59.         printf("ERROR: Błąd otwierania pliku!\n");
  60.         exit(-1);
  61.     }
  62.  
  63.     fgets(limitProcesowUzytkownika, 10, limitFile);             //# printf("!%d!",atoi(limitProcesowUzytkownika));
  64.     fgets(uruchomioneProcesyUzytkownika, 10, limitFile);        //# printf("!%d!",atoi(uruchomioneProcesyUzytkownika));
  65.     limitProcesow = atoi(limitProcesowUzytkownika)- atoi(uruchomioneProcesyUzytkownika);
  66.  
  67.     if (fclose(limitFile) == -1) {
  68.         printf("ERROR: Zamykanie pliku!");
  69.         exit(-1);
  70.     }
  71.  
  72.     if (limitProcesow <= liczbaKonsumentow) {
  73.         printf("ERROR: Nie mozna utworzyć tylu procesow!\n");
  74.         exit(-1);
  75.     }
  76.  
  77.     //# TWORZENIE KONSUMENTÓW:
  78.     for (int j = 1; j < liczbaKonsumentow; ++j) {
  79.  
  80.         if ((pid = fork()) < 0) {
  81.             perror("ERROR KONSUMENT: fork ");
  82.             exit(1);
  83.         } else if (pid != 0) {
  84.             break;
  85.         }
  86.     }
  87.  
  88.     //# PRZYGOTOWANIE PLIKU DO ZAPISU:
  89.     sprintf(charpid, "%d", getpid());
  90.     strcat(sciezkaPliku, charpid);
  91.  
  92.     fp = fopen(sciezkaPliku, "w");
  93.  
  94.     if (fp == NULL) {
  95.         perror("ERROR KONSUMENT: fopen ");
  96.         exit(1);
  97.     }
  98.  
  99.     //# PRZYGOTOWANIE POTOKU FIFO:
  100.     potok = open("./tmp/TST", O_RDONLY | O_NONBLOCK); //tylko do odczytu;
  101.  
  102.     if (potok == -1) {
  103.         perror("ERROR KONSUMENT: open ");
  104.         exit(1);
  105.     }
  106.  
  107.     //# CZYTANIE Z POTOKU:
  108.     sleep(10);
  109.     while (1) {
  110.  
  111.         ssize_t retval = read(potok, &bufor, sizeof(bufor));
  112.  
  113.         //# OSTATNI ODCZYT Z POTOKU
  114.         if (retval <= 0) {
  115.             if (retval == -1){
  116.                 perror("ERROR: Błąd czytanie z potoku - KONSUMENT");
  117.                 break;
  118.                 //puts("A TU KONCZY!\n");
  119.                 //exit(-1);
  120.  
  121.             } else {
  122.                 //puts("B TU KONCZY!\n");
  123.                 break;
  124.             }
  125.         }
  126.  
  127.         printf("%c", bufor);
  128.         fprintf(fp, "%c", bufor);
  129.         fflush(stdin);
  130.     }
  131.  
  132.     puts("TTUTTAAJJ!\n");
  133.     if (close(potok) == -1) {
  134.         perror("ERROR: Błąd zamykania potoku - KONSUMENT");
  135.         exit(-1);
  136.     }
  137.  
  138.     if (fclose(fp) == -1) {
  139.         perror("ERROR: Błąd zamykania pliku - KONSUMENT");
  140.         exit(-1);
  141.     }
  142.  
  143.     int waitStatus;
  144.     if (wait(&waitStatus) == -1) {
  145.         perror("ERROR: Błąd czekania na procesy potomne - KONSUMENT");
  146.         exit(-1);
  147.     }
  148.  
  149.     //puts("C TU KONCZY!\n");
  150.     return 0;
  151. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement