/* * Exemplu de blocare folosind operatii simple cu semafoare */ #include #include #include #define SEQFILE "secv" #define MAXBUF 100 #define SEMKEY ((key_t) 23456L) #include "err_sys.c" #include "bib.semafor.c" main() { int fd, i, n, pid, nrsecv, semid; char buf[MAXBUF]; pid = getpid(); if ((fd = open(SEQFILE, 2)) < 0) err_sys("Nu poate deschide"); if ((semid = sem_create(SEMKEY, 1)) < 0) err_sys("Nu se poate deschide semaforul"); for (i = 0; i < 20; i++) { sem_wait(semid); /* Blocheaza fisierul */ lseek(fd, 0L, 0); /* Pozitionare la inceput */ if ((n = read(fd, buf, MAXBUF)) <= 0) err_sys("Eroare la citire"); buf[n] = '\0'; /* Zeroul terminal */ if ((n = sscanf(buf, "%d\n", &nrsecv)) != 1) err_sys("Eroare la sscanf"); printf("pid = %d, secventa = %d\n", pid, nrsecv); nrsecv++; /* Incrementeaza secventa */ sprintf(buf, "%03d\n", nrsecv); n = strlen(buf); lseek(fd, 0L, 0); /* Revenire inainte de scriere */ if (write(fd, buf, n) != n) err_sys("Eroare la scriere"); sem_signal(semid); /* Deblocheaza fisierul */ } sem_close(semid); }