_  _   ,_
/^\/^\-/ @D
~(________/ PERL.LT
|L |L
L L
Straipsniai  Funkcijos 
Funkcijos/sysopen - atidaryti failą, pipe ar deskriptorių

  • sysopen FILEHANDLE,FILENAME,MODE
  • sysopen FILEHANDLE,FILENAME,MODE,PERMS

    Atidaro failą, kurio failo vardas duotas FILENAME, ir susieja jį su FILEHANDLE. Jei FILEHANDLE yra išsireiškimas, jo reikšmė naudojama kaip realios norimos filehandle pavadinimas. Ši funkcija kreipiasi į operacinėje sistemoje esančią open funkciją su parametrais FILENAME, MODE, PERMS.

    Įmanomos MODE parametro reikšmės ir vėliavėlių bitai yra priklausomi nuo sistemos; jie pasiekiami per standartinį modulį Fcntl. Operacinės sistemos dokumentacijoje aprašyta funkcijos open galimos reikšmės bei vėliavėlių (flags) bitai. Galima sujungti kelias vėliavėles, naudojant |-operatorių.

    Kai kurios dažniausios reikšmės yra O_RDONLY atidarant failą tik skaitymui skirtame režime (read-only), O_WRONLY atidarant failą tik rašymui skirtame režime (write-only) ir O_RDWR atidarant failą read-write režime.

    Dėl istorinių priežasčių, kai kurios reikšmės veikia beveik kiekvienoje Perl palaikomoje sistemoje: nulis reiškia read-only, vienas reiškia write-only, o du reiškia read-write. Žinoma, kad šios reikšmės neveikia OS/390 & VM/ESA Unix ir Macintosh; tad ko gero norinčių jas naudoti naujame kode nebus.

    Jei failas, pavadinimu FILENAME neegzistuoja ir open kreipimasis jį sukuria (dažniausiai todėl, kad MODE įtraukia O_CREAT vėliavėlę), tada PERMS reikšmės specifikuoja permissions'us naujai sukurto failo. Jei praleistas PERMS argumentas sysopen, Perl naudoja aštuntainę reikšmę 0666 . Šie permissions'ai turi būti aštuntainiai ir modifikuojami proceso dabartinio umask.

    Daugumoje sistemų O_EXCL flag'as galimas atidarinėjant failus išskirtiniame režime. Tai nėra užlokinimas: išskirtinumas čia reiškia, kad jei failas jau egzistuoja, sysopen() nesuveikia. O_EXCL gali neveikti tinklinėse failų sistemose ir neturi jokio efekto, kol O_CREAT flag'as taip pat nėra nustatyta. Užstatant O_CREAT|O_EXCL neleidžia atidaryti failo, jei tai yra simbolinė sąsaja, tačiau neapsaugo nuo simbolinių sąsajų failo path'e.

    Kartais norima sutrumpinti jau egzistuojantį failą. Tai gali būti padaryta naudojant O_TRUNC vėliavėlę. O_TRUNC elgesys su O_RDONLY yra neapibrėžtas.

    Retai, jei išvis kada turėtų būti naudojamas 0644 kaip argumentas sysopen, nes jis atima vartotojo pasirinktį turėti atlaidesnį umask. Geriau jį praleisti. Skaityti perlfunc(1) skirių apie umask daugiau apie tai.

    Pažymėtina, jog sysopen priklauso nuo fdopen() C bibliotekos funkcijos. Daugelyje UNIX sistemų, fdopen() patiria nesėkmę, kai failo deskriptoriai yra didesni nei tam tikra reikšmė, dažniausia 255. Jei reikia daugiau nei tiek deskriptorių, verta apgalvoti rebuildinti Perl, kad šis naudotų sfio biblioteką ar, gal, naudojant POSIX::open() funkciją.

    Daugiau perlopentut mielesniam, ir mandagesniam failų atidarymo aprašymui.

algirdas@perl.lt 2005.04.11 - $dabar