/* * Rutinele de blocare si deblocare a fisierului folosind apelul * sistem link() */ #include extern int errno; #define FISBLOCAJ "fis.blocaj" my_lock(fd) int fd; { int tempfd; char tempfile[30]; sprintf(tempfile, "LCK%d", getpid()); /* * Creeaza un fisier temporar cu numele LCKpid si apoi il * inchide. Daca fisierul temporar exista deja, atunci functia * creat() il va trunchia la lungimea 0. */ if ((tempfd = creat(tempfile, 0444)) < 0) err_sys("Nu poate crea fisierul temporar"); close(tempfd); /* * Acum se incearca renumirea fisierului temporar la fisierul * de blocat. Daca un alt proces a executat un my_lock, atunci * apelul sistem link va genera o eroare. Aceasta eroare apare * deoarece daca numele unei legaturi la un fisier exista * deja, atunci link va esua. */ while (link(tempfile, FISBLOCAJ) < 0) { if (errno != EEXIST) err_sys("Eroare la link"); sleep(1); } if (unlink(tempfile) < 0) err_sys("Eroare la unlink"); } my_unlock(fd) int fd; { if (unlink(FISBLOCAJ) < 0) err_sys("Nu se poate debloca prin unlink"); }