exec (Unix)

exec*()on ryhmä systeemikutsujen alle Unix ja Unix- käyttöjärjestelmiin . Heillä kaikilla on yhteistä uuden prosessin aloittaminen olemassa olevan prosessin ympäristössä ja siten sen korvaaminen. (Tätä prosessia kutsutaan myös päällekkäiseksi .) POSIX- standardissa seuraavat funktioprototyypit määritetään otsikkotiedostossa unistd.h :

 int execl(char const *path, char const *arg0, ...);
 int execle(char const *path, char const *arg0, ..., char const *envp[]);
 int execlp(char const *file, char const *arg0, ...);
 int execv(char const *path, char const *argv[]);
 int execve(char const *path, char const *argv[], char const *envp[]);
 int execvp(char const *file, char const *argv[]);

Tarkoittaa:

arg0
ensimmäinen (oikeastaan: nolla, koska se on implisiittisesti asetettu) argumentti komentorivillä ja tavallisesti suoritettavan suoritettavan tiedoston nimi. Huonosti ohjelmoitu ohjelmisto voi luottaa näihin tietoihin tarkan sijainnin määrittämiseksi tiedostojärjestelmässä, josta käynnissä oleva ohjelma ladattiin. Tätä ei kuitenkaan taata standardi, mutta sitä ei myöskään säännellä johdonmukaisesti eri alustoilla.
envp []
joukko osoittimia, jotka osoittavat muuttujan = arvo merkkijonoja ja edustavat prosessin ympäristöä
polku
suoritettavan tiedoston polun nimi. (Tätä tulisi käyttää näihin tietoihin arg0: n sijasta .)
argv []
joukko osoittimia, jotka osoittavat annettuja komentoriviargumentteja.

Molemmat matriisit ovat mukana envp[]ja argv[]sisältävät viitteitä nollapäätteisiin merkkijonoihin. Matriisin viimeinen elementti on tavallisesti nollaosoitin, joka osoittaa taulukon lopun.

Sivuvaikutukset

Kutsuprosessin avoimet tiedostokuvaajat pysyvät avoimina myös uudessa prosessissa. Ympäristö säilyy myös periaatteessa. Sen sijaan (yksityinen) data ja kutsuprosessin koodi tuhoutuu peitteen avulla ja korvataan datalla ja peitteen koodilla. Toisin kuin yksinomaan käytetty muisti , tämä ei vaikuta jaettuun muistiin .

exec*()Soittoprosessi ei voi kysyä onnistuneesti suoritetun puhelun palautuskoodia, koska tämä on korvattu puhelulla. Prosessin korvaaminen exec * () -kutsulla ei lopeta prosessia, joka on edelleen olemassa (vain muuttuneessa tilassa). Epäonnistuneen puhelun tapauksessa (tässä tapauksessa vaihdettava prosessi on edelleen käynnissä), −1 palautetaan ja asetetaan errnoyhteen seuraavista arvoista (katso errno.h):

E2BIG Argumenttiluettelo on suurempi kuin asiaankuuluva järjestelmäraja sallii.
EACCES Pääsy suoritettavaan tiedostoon evättiin. (Mahdolliset syyt voivat olla: tiedosto lukittu, puuttuvat oikeudet ...)
ENOENT Aloitettavaa suoritettavaa tiedostoa ei löydy.
ENOMEM Muisti ei riitä ohjelman käynnistämiseen.

Historia, nykyinen käyttö

Alkuperäinen Unix ei voinut aloittaa uutta, erilaista prosessia olemassa olevasta prosessista yhdessä vaiheessa. Sen sijaan luotiin kopio olemassa olevasta prosessista haarukalla () ja sitten yhtä exec*()toiminnoista käytettiin tarjoamaan luotu kopio (erilaisella) peittokuvalla. Tällä järjestelmäkutsuryhmällä oli siis suuri merkitys.

Sillä välin, POSIX on määritelty ryhmä järjestelmä puheluiden posix_spawn*()kuin (valinnainen) laajennus, jonka sekvenssi fork()- voidaan exec*()välttää, mutta osan menetys joustavuutta, että tämä mekanismi tarjoaa.

exec komentotulkkikomentona

Monet yleiset Unix-kuoret toteuttavat myös komennon, execjoka tekee periaatteessa saman asian kuin järjestelmäkutsu: käynnissä oleva prosessi (tai käynnissä oleva komentosarja) korvataan määritetyn uuden suoritettavan tiedoston esiintymällä. Annetussa esimerkissä tätä mekanismia käytetään poistumaan X11- käynnistyskomentosarjasta ikkunanhallinnan soittamisen jälkeen:

 #!/bin/ksh
 xclock &
 xsetroot -solid black
 exec mwm -multiscreen -xrm "ShowFeedback: -quit"

nettilinkit