Advertisement
Guest User

s

a guest
Apr 2nd, 2020
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.18 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #include <unistd.h>
  6. #include <sys/types.h>
  7. #include <sys/stat.h>
  8. #include <fcntl.h>
  9.  
  10. void initializare_fisier_date();
  11. void afisare_fisier_date();
  12. void secventa_de_actualizari(int n, char* nr[]);
  13.  
  14. int main(int argc, char* argv[])
  15. {
  16. if(argc == 1)
  17. {
  18. fprintf(stderr, "Eroare: programul trebuie apelat cu optiunile: -i, -o, sau cu o secventa de numere reale...\n"); return 1;
  19. }
  20. if( strcmp(argv[1],"-i") == 0 )
  21. {
  22. initializare_fisier_date(); return 0;
  23. }
  24. if( strcmp(argv[1],"-o") == 0 )
  25. {
  26. afisare_fisier_date(); return 0;
  27. }
  28. secventa_de_actualizari(argc, argv);
  29. return 0;
  30. }
  31.  
  32.  
  33. void initializare_fisier_date()
  34. {
  35.  
  36. int fd;
  37. float val;
  38.  
  39. printf("Dati cantitatea initiala de combustibil (i.e., un numar real pozitiv): ");
  40. while( (1 != scanf("%f", &val)) && (val < 0) ) { fprintf(stderr,"Eroare: nu ati introdus un numar real pozitiv! Incercati din nou..."); }
  41.  
  42. if(-1 == (fd = creat("peco.bin", 0600) ) )
  43. {
  44. perror("Eroare la crearea fisierului de date..."); exit(2);
  45. }
  46.  
  47. if(-1 == write(fd, &val, sizeof(float) ) )
  48. {
  49. perror("Eroare la scrierea valorii initiale in fisierul de date..."); exit(3);
  50. }
  51.  
  52. close(fd);
  53. }
  54.  
  55.  
  56. void afisare_fisier_date()
  57. {
  58.  
  59. int fd;
  60. float val;
  61.  
  62. if ( -1 == (fd = open("peco.bin", O_RDONLY) ) )
  63. {
  64. perror("Eroare la deschiderea pentru afisare a fisierului de date..."); exit(4);
  65. }
  66.  
  67. if (-1 == read(fd, &val, sizeof(float) ) )
  68. {
  69. perror("Eroare la citirea valorii finale din fisierul de date..."); exit(5);
  70. }
  71.  
  72. close(fd);
  73. printf("Stocul final de combustibil este: %f litri de combustibil.\n", val);
  74. }
  75.  
  76.  
  77. void secventa_de_actualizari(int n, char* nr[])
  78. {
  79.  
  80. float valoare, stoc;
  81. int fd,i;
  82.  
  83. if ( -1 == (fd = open("peco.bin", O_RDWR) ) )
  84. {
  85. perror("Eroare la deschiderea pentru actualizare a fisierului de date..."); exit(6);
  86. }
  87.  
  88. srandom( getpid() );
  89.  
  90. for(i = 1; i < n; i++)
  91. {
  92. if(1 != sscanf(nr[i], "%f", &valoare))
  93. {
  94. fprintf(stderr, "[PID: %d] Eroare: ati specificat o valoare invalida drept argument de tip numar real : %s !\n", getpid(), nr[i] );
  95. exit(7);
  96. }
  97. struct flock lacat_blocaj, lacat_deblocaj;
  98.  
  99. lacat_blocaj.l_type = F_WRLCK;
  100. lacat_blocaj.l_whence = SEEK_CUR;
  101. lacat_blocaj.l_start = 0;
  102. lacat_blocaj.l_len = sizeof(float);
  103.  
  104. if(-1 == fcntl(fd, F_SETLKW, &lacat_blocaj))
  105. {
  106. perror("Eroare la blocaj"); exit(10);
  107. }
  108.  
  109. if(-1 == lseek(fd, 0, SEEK_SET) )
  110. {
  111. perror("Eroare la repozitionarea in fisierul de date, pentru citire..."); exit(8);
  112. }
  113. if (-1 == read(fd, &stoc, sizeof(float) ) )
  114. {
  115. perror("Eroare la citirea valorii din fisierul de date..."); exit(9);
  116. }
  117.  
  118. printf("[PID: %d] Se adauga/extrage in/din rezervor cantitatea de %f litri de combustibil.\n", getpid(), valoare );
  119.  
  120. stoc = stoc + valoare;
  121. if(stoc<0)
  122. {
  123. printf("Pentru aceasta cantitate %f, stocul este negativ, alegeti ce doriti sa faceti \n",valoare);
  124. printf("Apasati R pentru a refuza operatia de extragere sau E pentru a realiza extragerea partiala, adica cat este stocul %f.\n",(stoc-valoare));
  125. char selection;
  126. do{
  127. printf("Ce varianta doriti?(R/E) : ");
  128. scanf("%c",&selection);
  129. switch(selection){
  130. case 'R':{
  131. printf("Ati refuzat extragerea din stoc\n");
  132. stoc = stoc - valoare;
  133. printf("Stocul este inapoi %f\n",stoc);
  134. break;
  135. }
  136. case 'E':{
  137. printf("Ati ales extragerea partiala, adica %f \n",(stoc-valoare));
  138. stoc = 0;
  139. break;
  140. }
  141. default:{
  142. printf("Tasta gresit! Alegeti una corecta! \n");
  143. break;
  144. }
  145. }
  146. }while(selection!='R'&&selection!='E');
  147. }
  148. if(-1 == lseek(fd, 0, SEEK_SET) )
  149. {
  150. perror("Eroare la repozitionarea in fisierul de date, pentru scriere..."); exit(10);
  151. }
  152. if (-1 == write(fd, &stoc, sizeof(float) ) )
  153. {
  154. perror("Eroare la scrierea valorii actualizate in fisierul de date..."); exit(11);
  155. }
  156.  
  157.  
  158. lacat_deblocaj.l_type = F_UNLCK;
  159. lacat_deblocaj.l_whence = SEEK_CUR;
  160. lacat_blocaj.l_start = -sizeof(float);
  161. lacat_blocaj.l_len = sizeof(float);
  162. if(-1 == fcntl(fd, F_SETLKW, &lacat_deblocaj))
  163. {
  164. perror("Eroare la deblocaj"); exit(16);
  165. }
  166.  
  167. sleep( random() % 5 );
  168. }
  169.  
  170. close(fd);
  171. printf("[PID: %d] Am terminat de procesat secventa de actualizari.\n", getpid());
  172. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement