Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- void initializare_fisier_date();
- void afisare_fisier_date();
- void secventa_de_actualizari(int n, char* nr[]);
- int main(int argc, char* argv[])
- {
- if(argc == 1)
- {
- fprintf(stderr, "Eroare: programul trebuie apelat cu optiunile: -i, -o, sau cu o secventa de numere reale...\n"); return 1;
- }
- if( strcmp(argv[1],"-i") == 0 )
- {
- initializare_fisier_date(); return 0;
- }
- if( strcmp(argv[1],"-o") == 0 )
- {
- afisare_fisier_date(); return 0;
- }
- secventa_de_actualizari(argc, argv);
- return 0;
- }
- void initializare_fisier_date()
- {
- int fd;
- float val;
- printf("Dati cantitatea initiala de combustibil (i.e., un numar real pozitiv): ");
- while( (1 != scanf("%f", &val)) && (val < 0) ) { fprintf(stderr,"Eroare: nu ati introdus un numar real pozitiv! Incercati din nou..."); }
- if(-1 == (fd = creat("peco.bin", 0600) ) )
- {
- perror("Eroare la crearea fisierului de date..."); exit(2);
- }
- if(-1 == write(fd, &val, sizeof(float) ) )
- {
- perror("Eroare la scrierea valorii initiale in fisierul de date..."); exit(3);
- }
- close(fd);
- }
- void afisare_fisier_date()
- {
- int fd;
- float val;
- if ( -1 == (fd = open("peco.bin", O_RDONLY) ) )
- {
- perror("Eroare la deschiderea pentru afisare a fisierului de date..."); exit(4);
- }
- if (-1 == read(fd, &val, sizeof(float) ) )
- {
- perror("Eroare la citirea valorii finale din fisierul de date..."); exit(5);
- }
- close(fd);
- printf("Stocul final de combustibil este: %f litri de combustibil.\n", val);
- }
- void secventa_de_actualizari(int n, char* nr[])
- {
- float valoare, stoc;
- int fd,i;
- if ( -1 == (fd = open("peco.bin", O_RDWR) ) )
- {
- perror("Eroare la deschiderea pentru actualizare a fisierului de date..."); exit(6);
- }
- srandom( getpid() );
- for(i = 1; i < n; i++)
- {
- if(1 != sscanf(nr[i], "%f", &valoare))
- {
- fprintf(stderr, "[PID: %d] Eroare: ati specificat o valoare invalida drept argument de tip numar real : %s !\n", getpid(), nr[i] );
- exit(7);
- }
- struct flock lacat_blocaj, lacat_deblocaj;
- lacat_blocaj.l_type = F_WRLCK;
- lacat_blocaj.l_whence = SEEK_CUR;
- lacat_blocaj.l_start = 0;
- lacat_blocaj.l_len = sizeof(float);
- if(-1 == fcntl(fd, F_SETLKW, &lacat_blocaj))
- {
- perror("Eroare la blocaj"); exit(10);
- }
- if(-1 == lseek(fd, 0, SEEK_SET) )
- {
- perror("Eroare la repozitionarea in fisierul de date, pentru citire..."); exit(8);
- }
- if (-1 == read(fd, &stoc, sizeof(float) ) )
- {
- perror("Eroare la citirea valorii din fisierul de date..."); exit(9);
- }
- printf("[PID: %d] Se adauga/extrage in/din rezervor cantitatea de %f litri de combustibil.\n", getpid(), valoare );
- stoc = stoc + valoare;
- if(stoc<0)
- {
- printf("Pentru aceasta cantitate %f, stocul este negativ, alegeti ce doriti sa faceti \n",valoare);
- printf("Apasati R pentru a refuza operatia de extragere sau E pentru a realiza extragerea partiala, adica cat este stocul %f.\n",(stoc-valoare));
- char selection;
- do{
- printf("Ce varianta doriti?(R/E) : ");
- scanf("%c",&selection);
- switch(selection){
- case 'R':{
- printf("Ati refuzat extragerea din stoc\n");
- stoc = stoc - valoare;
- printf("Stocul este inapoi %f\n",stoc);
- break;
- }
- case 'E':{
- printf("Ati ales extragerea partiala, adica %f \n",(stoc-valoare));
- stoc = 0;
- break;
- }
- default:{
- printf("Tasta gresit! Alegeti una corecta! \n");
- break;
- }
- }
- }while(selection!='R'&&selection!='E');
- }
- if(-1 == lseek(fd, 0, SEEK_SET) )
- {
- perror("Eroare la repozitionarea in fisierul de date, pentru scriere..."); exit(10);
- }
- if (-1 == write(fd, &stoc, sizeof(float) ) )
- {
- perror("Eroare la scrierea valorii actualizate in fisierul de date..."); exit(11);
- }
- lacat_deblocaj.l_type = F_UNLCK;
- lacat_deblocaj.l_whence = SEEK_CUR;
- lacat_blocaj.l_start = -sizeof(float);
- lacat_blocaj.l_len = sizeof(float);
- if(-1 == fcntl(fd, F_SETLKW, &lacat_deblocaj))
- {
- perror("Eroare la deblocaj"); exit(16);
- }
- sleep( random() % 5 );
- }
- close(fd);
- printf("[PID: %d] Am terminat de procesat secventa de actualizari.\n", getpid());
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement