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
- Kuvaus avoimesta ryhmästä vuodelta 2016