_  _   ,_
/^\/^\-/ @D
~(________/ PERL.LT
|L |L
L L
Straipsniai  Funkcijos 
Funkcijos/flock - užrakina visą failą advisory lock
  • flock FILEHANDLE,OPERATION

    Iškviečia flock(2), arba jo emuliaciją FILEHANDLE'ui. Gražina true sėkmės atveju, nesėkmės - false. Grąžina fatal error, jei panaudojamas sistemoje, kurioje neįdiegtas flock(2), fcntl(2) locking, arba lockf(3). flock yra Perlo portatyvus failų blokavimo interfeisas, nors jis užlockina tik failus, ne įrašus.

    Dvi potencialiai neakivaizdžios, tačiau tradicinės flock semantikos yra kad jis laukia neribotą laiką iki kol užrakinimas failo patvirtinamas arba kad jo blokavimas yra tik patariamasis. Tokie diskretiški blokavimo būdai yra lankstesni, bet suteikia mažiau garantijų. Tai reiškia, kad failai, užrakinti su flock gali būti modifikuojami programų kurios taip pat nenaudoja flock. Žr. perlport, savo portų specifinę dokumentaciją arba specifiniuose sistemai manualo puslapiuose dėl detalesnio aprašymo. Geriausia programuoti laikantis tradicinio veikimo, jei rašoma portabilias programas. (Bet jei to nereikia - laisvai galite rašyti programas, atitinkančias savo sistemos išskirtinius bruožus. Bejėgiškas įsikibimas į portabilumo faktorių neturėtų būti kliūtis dirbant savo darbą.)

    OPERATION yra vienas LOCK_SH, LOCK_EX arba LOCK_UN, greičiausia sujungtas su LOCK_NB. Šios konstantos tradiciškai yra 1, 2, 8 ir 4, bet galima naudoti ir simbolinius vardus, importuojant juos iš Fcntl arba individualiai arba kaip grupei naudojant ':flock' tagą. LOCK_SH reikalauja bendro lock'o, LOCK_EX reikalauja išimtinio lock'o, o LOCK_UN duoda pareikalaujamą lock'ą. Jei LOCK_NB yra panaudojamas su loginiu OR'u ir LOCK_SH arba LOCK_EX tokiu atveju flock grąžins rezultatą iškart, o nereikės blokuoti lock'o laukimo (ar kas nors gaunama - reikia patikrinti grąžinimo būseną).

    Norint išvengti nekoordinacijos galimybės, Perl dabar iš pradžių sulygiujoa FILEHANDLE prieš užrakindamas arba atrakindamas ją.

    Pažymėtina, kad emuliacija, subuilidinta su lockf(3) neteikia bendro užrakto ir reikalauja, kad FILEHANDLE būtų atidarytas su rašymo ketinimais. Tai yra semanikta, kurią idiegia lockf(3). Dauguma, jei ne visos sistemos, įdiegia lockf(3) fcntl(2) užrakto kalba, nors, tad skirtinos semantikos neturėtų būti pernelyg didele kliūtimi daugumai žmonių.

    Pažymėtina, kad kuomet flock(3) emuliuoja fcntl(2), reikalaujama, kad FILEHANDLE būtų atidarytas su nuskaitymo ketinimais tam kad būtų panaudota LOCK_SH ir reikalauja, kad būtų atvira su įrašymo ketinimais kad naudoti LOCK_EX.

    Pažymėtina, kad kai kurios flock versijos negali užlockinti per tinklą pasiekiamų objektų; tam reikėtų naudoti daugiau specifinį fcntl. Jeigu norima, galima priversti Perl ignoruoti sistemos flock(2) funkciją, ir veikti su paties fcntl(2) paremta emuliaciją, perduodant jungiklį -Ud_flock į Configure programą, konfiguruojant perlą.

    Štai prijungimas prie pašto dėžutės BSD systemoms.

        use Fcntl ':flock'; # importuoti LOCK_* konstantas
        sub lock {
    	flock(MBOX,LOCK_EX);
    	# ir jei kas nors prisijungė
    	# kol mes laukėme...
    	seek(MBOX, 0, 2);
        }
        sub unlock {
    	flock(MBOX,LOCK_UN);
        }
        open(MBOX, ">>/usr/spool/mail/$ENV{'USER'}")
    	    or die "Can't open mailbox: $!";
        lock();
        print MBOX $msg,"\n\n";
        unlock();

    Sistemose, kurios palaiko realų flock(), užrakinimai yra paveldimi per fork() kvietimus, o tuo tarpu kas privalo naudoti kaprizingesnę fcntl() funkciją, praranda lock'us, apsunkindami serverių rašymą.

    Taip pat žr. DB_File kitiems flock() pavyzdžiams.

algirdas@perl.lt 2005.04.11 - $dabar