_  _   ,_
/^\/^\-/ @D
~(________/ PERL.LT
|L |L
L L
Straipsniai  Funkcijos 
Funkcijos/system - paleisti atskirą programą

  • system LIST
  • system PROGRAM LIST

    Dar tą patį kaip ir exec LIST , išskyrus tai, kad pirmiausia padaromas išsišakojimas (fork), ir vyresnysis (parent) procesas laukia, kol bus įvykdytas vaiko (child) procesas. Pažymėtina, jog argumentų apdorojimas priklauso nuo argumentų kiekio . Jei daugiau nei vienas argumentas LIST'e, ar jei LIST yra masyvas su daugiau nei viena reikšme, pradeda pradeda programą, nurodytą pirmojo sąrašo elemento, o kiti elementai traktuojami kaip argumentai. Jei yra tik vienas skaliarinis argumentas, jis patikrinamas ar turi shell'o metasimbolių, o jei tokių randama, argumentas perduodamas sistemos komandiniam shellui, parsinimui (t.y. /bin/sh -c Unix platformose, ir skirtingi kitoms platformoms). jei nėra shell'o metasimbolių argumente, jis išskaidomas į žodžius ir perduodamas tiesiai į execvp , kuris yra produktyvesnis.

    Pradedant v5.6.0, Perl mėgina atidaryti visus failus išvedimui prieš bet kokią operaciją, kuri gali sąlygoti šakojimąsi (fork), bet kai kurios platformos to gali nepalaikyti (daugiauperlport). Norint apsisaugoti, reikia nustatyti $| ($AUTOFLUSH angliškai) ar iškviesti autoflush() metodą iš IO::Handle visiems atidarytiems handle'ams.

    Gražinama reikšmė yra programos exit statusas, gražintas wait kreipinio. Norint gauti tikrąją exit reikšmę, reikia persikelti į dešinę per aštuonias reikšmes (žr. žemiau). Taip pat žiūrėtiexec. Tai nėra tai, ką reikėtų naudoti komandos išvedimo fiksavimui, tam tinka paprasčiausiai backtick'as ar qx//, kaip aprašyta "`STRING`" perlop. Gražinama reikšmė-1 indicates a rodo nesėkmingą mėginimą startuoti programą (norint išsiaiškinti priežastį, reikia tikrinti $!).

    Kaip exec, system leidžia pameluoti programai apie jos pavadinimą, jei naudojamasystem PROGRAM LIST sintaksė. Vėl, skaityti exec.

    Kadangi SIGINT ir SIGQUIT ignoruojami per system paleidimą, jei tikimasi, kad programa nutrauks sasvo darbą gavus šiuos signalus, reikės prisitaikyti ją pačiam, atsižvelgiant į gražinamą reikšmę.

        @args = ("command", "arg1", "arg2");
        system(@args) == 0
    	 or die "system @args failed: $?"

    Galima peržiūrėti visas galimybes dėl ko gali kilti nesklandumų, peržiūrint $? taip:

        if ($? == -1) {
    	print "failed to execute: $!\n";
        }
        elsif ($? & 127) {
    	printf "child died with signal %d, %s coredump\n",
    	    ($? & 127),  ($? & 128) ? 'with'  o>: 'without';
        }
        else {
    	printf "child exited with value %d\n", $? >> 8;
        }

    siekiant portabilumo, reikėtų naudoti POSIX plėtinio W*() kreipinius; daugiau skaityti perlport.

    Kai argumentai paleidžiami per sisteminį shell'ą, rezultatai ir gražinami kodai bus linkę į savo keistumus ir t.t. Detaliau skaityti "`STRING`" perlop ir exec.

algirdas@perl.lt 2005.04.11 - $dabar