_  _   ,_
/^\/^\-/ @D
~(________/ PERL.LT
|L |L
L L
Straipsniai  Funkcijos 
Funkcijos/syscall - paleisti sutartinį sistemos kvietimą

  • syscall NUMBER, LIST

    Iškviečia sisteminį kreipinį, aprašytą kaip pirmas sarašo elementas, likusius sarašo elementus perduodamas kaip argumentus. Jei neįdiegtas, sukelia fatal errror. Argumentai interpretuojami taip: jei duotas argumentas skaitinis - argumentas perduodamas kaip int. jei ne, perduodama rodyklė (pointeris) į sekos reikšmę. Reikia užtikrinti, kad stringas yra išplėstas pakankamai, kad galėtų priimti bet kokį rezultatą, kuris gali būti įrašytas į ją. Negalima naudoti raidinės string'o kaip syscall argumento, nes Perl privalo manyti, jog bet kokia string'o rodyklė (pointeris) gali būti perrašyta. Jei sveikieji argumentai nėra raidiniai ir niekada nebuvo interpretuoti numeriškame kontekste, gali reikėti pridėti 0 prie jų, kad priversti juos atrodyti kaip numerius. Tai emuliuoja syswrite funkciją (ar atvirkščiai):

        require 'syscall.ph';		# gali reikėti paleižiant h2ph
        $s = "ei labas\n";
        syscall(&SYS_write, fileno(STDOUT), $s, length $s);

    Pažymėtina, kad Perl palaiko iki 14 perduodamų argumentų sisteminiam kreipiniui, ko praktikoje turėtų dažniausiai užtekti.

    Syscall gražina bet kokią reikšmę, gražintą sisteminio kreipinio, kurį jis iškviečia. Jei nepavyksta kreiptis, syscall gražina -1 ir nustato $! (errno). Taip pat pažymėtina, jog kai kurie sisteminiai kreipiniai gali visai teisėtai gražinti -1 . Teisingas būdas tvarkyti tokius kreipinius yra priskirti $!=0; prieš kreipinį ir patikrinti $! reikšmę, ar syscall negražina -1 .

    Yra problema su syscall(&SYS_pipe): jis gražina failo numerį, kur pabaigė nuskaityti jo sukurta jungtis(pipe). Nėra jokios galimybės gauti failo kito galo failo numerį. Šios problemos galima išvengti naudojant pipe.

algirdas@perl.lt 2005.04.11 - $dabar