exec (systemanrop) - exec (system call)
I datorer är exec en funktionalitet i ett operativsystem som kör en körbar fil i samband med en redan existerande process som ersätter den tidigare körbara. Denna handling kallas också ett overlay . Det är särskilt viktigt i Unix-liknande system, även om det finns någon annanstans. Eftersom ingen ny process skapas ändras inte processidentifieraren (PID) utan maskinkoden , data , heap och stacken för processen ersätts av de i det nya programmet.
Den ledn samtalet är tillgänglig för många programmeringsspråk , inklusive compilable språk och vissa skriptspråk . I OS kommando tolkar den exec inbyggda kommandot ersätter skalet processen med det angivna programmet.
Nomenklatur
Gränssnitt att köra och dess implementeringar varierar. Beroende på programmeringsspråk kan det vara tillgängligt via en eller flera funktioner , och beroende på operativsystem kan det representeras med ett eller flera faktiska systemanrop . Av denna anledning beskrivs exec ibland som en samling funktioner .
Standardnamn på sådana funktioner i C är execl , execle , execlp , execv , execve och execvp (se nedan ), men inte "exec" i sig. Den Linuxkärnan har ett motsvarande systemanrop som heter "execve", medan alla nämnda funktioner är användarutrymmes omslag runt den.
Språk på högre nivå ger vanligtvis ett samtal med namnet exec .
Unix, POSIX och andra multitasking-system
C-språkprototyper
Den POSIX standard förklarar Exec funktioner i unistd.h sidhuvudfilen i C-språket . Samma funktioner deklareras i process.h för DOS (se nedan ), OS / 2 och Microsoft Windows.
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[]);
Vissa implementeringar ger dessa funktioner en ledande understrykning (t.ex. _execl).
Basen för var och en är exec (execute) följt av en eller flera bokstäver:
- e - En rad pekare till miljövariabler skickas uttryckligen till den nya processbilden.
- l - Kommandoradsargument skickas individuellt (en l ist) till funktionen.
- p - Använder miljövariabeln PATH för att hitta filen i filen argument som ska utföras.
- v - Kommandoradsargument skickas till funktionen som en matris ( v ector) av pekare.
- väg
Argumentet anger sökvägen till filen som ska köras som den nya processavbildningen. Argument som börjar på arg0 är pekare till argument som ska skickas till den nya processbilden. Den argv värdet är en array av pekare till argument.
- arg0
Det första argumentet arg0 bör vara namnet på den körbara filen. Vanligtvis är det samma värde som sökargumentet . Vissa program kan felaktigt förlita sig på detta argument som ger plats för den körbara filen, men det finns ingen garanti för detta och är inte standardiserat över plattformar.
- envp
Argument envp är en rad pekare till miljöinställningar. De Exec samtal heter slutar med ett e förändra miljön för den nya processen bilden genom att en lista med inställningar miljön genom envp argument. Detta argument är en rad teckenpekare; varje element (förutom det sista elementet) pekar på en nollavslutad sträng som definierar en miljövariabel .
Varje nollavslutad sträng har formen:
name=value
där namnet är namnet på miljövariabeln och värdet är värdet på den variabeln. Det sista elementet i envp- matrisen måste vara noll .
I execl- , execlp- , execv- och execvp- samtal ärver den nya processbilden de aktuella miljövariablerna.
Effekter
En filbeskrivare som är öppen när ett exec- samtal görs förblir öppen i den nya processavbildningen, såvida den inte fcntlades med FD_CLOEXEC eller öppnades med O_CLOEXEC (den senare introducerades i POSIX.1-2001). Denna aspekt används för att specificera standardströmmarna (stdin, stdout och stderr) för det nya programmet.
Ett framgångsrikt överlägg förstör det tidigare minnesadressutrymmet i processen, och alla dess minnesområden, som inte delades , återvinns av operativsystemet. Följaktligen går all data som inte överlämnats till det nya programmet eller på annat sätt sparats förlorat.
Returvärde
En lyckad exec ersätter den aktuella processbilden, så den kan inte returnera någonting till programmet som ringde. Processer har en utgångsstatus , men det värdet samlas in av den överordnade processen .
Om en exec-funktion återgår till det anropande programmet uppstår ett fel, returvärdet är −1 och errno är inställt på något av följande värden:
| namn | Anteckningar |
|---|---|
| E2BIG | Argumentlistan överskrider systemgränsen. |
| EACCES | Den angivna filen har en låsnings- eller delningsöverträdelse. |
| ENOENT | Filen eller sökvägen hittades inte. |
| ENOMEM | Det finns inte tillräckligt med minne för att köra den nya processbilden. |
DOS-operativsystem
DOS är inte ett multitasking- operativsystem, men att ersätta den tidigare körbara bilden har en stor förtjänst där på grund av hårda primära minnesbegränsningar och brist på virtuellt minne . Samma API används för att lägga över program i DOS och har liknande effekter som på POSIX-system.
MS-DOS exec- funktioner laddar alltid det nya programmet i minnet som om "maximal tilldelning" i programmets körbara filrubrik är inställd på standardvärdet 0xFFFF. EXEHDR-verktyget kan användas för att ändra det maximala tilldelningsfältet för ett program. Men om detta görs och programmet anropas med en av exec- funktionerna kan programmet fungera annorlunda än ett program som anropas direkt från operativsystemets kommandorad eller med en av spawn- funktionerna (se nedan ).
Kommandotolkar
Många Unix-skal erbjuder också ett inbyggt exec- kommando som ersätter skalprocessen med det angivna programmet. Wrapper- skript använder ofta detta kommando för att köra ett program (antingen direkt eller via en tolk eller virtuell maskin ) efter att ha ställt in miljövariabler eller annan konfiguration. Genom att använda exec behöver inte resurserna som används av skalprogrammet stanna kvar efter att programmet startats.
Den exec kommando kan också utföra en omdirigering . I vissa skal är det till och med möjligt att använda exec- kommandot endast för omdirigering utan att göra ett faktiskt överlägg.
Alternativ
Det traditionella Unix- systemet har inte funktionen att skapa en ny process som kör ett nytt körbart program i ett steg, vilket förklarar vikten av exec för Unix-programmering. Andra system kan använda spawn som huvudverktyg för körning av körbara filer. Dess resultat motsvarar gaffel-exec- sekvensen för Unix-liknande system. POSIX stöder posix_spawn- rutinerna som en valfri förlängning som vanligtvis implementeras med vfork .
Andra system
OS / 360 och efterföljare inkluderar ett systemanrop XCTL (överföringskontroll) som utför en liknande funktion att utföra.
Se även
- Kedjelastning , överlagring i systemprogrammering
- avsluta (systemanrop) , avsluta en process
- gaffel (systemanrop) , gör en ny process (men med samma körbar)
- klon () , sättet att skapa nya trådar
- PATH (variabel) , relaterad till semantiken för argumentet * path
Referenser
- ^ a b "exec (3) - Linux manuell sida" . man7.org . Hämtad 2016-10-14 .
- ^ "Skalomslagare" . Linux-dokumentationsprojekt . 2014-03-10 . Hämtad 2021-02-18 .
externa länkar
- : kör en fil - Systemgränssnittsreferens, den enda UNIX-specifikationen , nummer 7 från The Open Group