Spawn (calcul) - Spawn (computing)
Spawn în calcul se referă la o funcție care încarcă și execută un nou proces copil . Procesul actual poate aștepta ca copilul să se termine sau poate continua să execute calcule concurente . Crearea unui subproces nou necesită suficientă memorie în care se poate executa atât procesul copil, cât și programul curent.
Există o familie de funcții spawn în DOS , moștenită de Microsoft Windows .
Există, de asemenea, o familie diferită de funcții spawn într-o extensie opțională a standardelor POSIX .
DOS / Windows generează funcții
Funcțiile de generare DOS / Windows sunt inspirate de funcțiile Unix fork și exec ; totuși, deoarece aceste sisteme de operare nu acceptă furcă, funcția spawn a fost furnizată ca înlocuitor pentru combinația furcă-exec. Cu toate acestea, funcția spawn, deși se ocupă în mod adecvat de cele mai frecvente cazuri de utilizare, nu are puterea maximă a fork-exec, deoarece după furcă orice setări de proces care vor supraviețui unui exec pot fi modificate. Cu toate acestea, în majoritatea cazurilor, această deficiență poate fi remediată prin utilizarea API-ului CreateProcess mai scăzut.
În apelurile spawnl , spawnlp , spawnv și spawnvp , procesul copil moștenește mediul părintelui. Fișierele care sunt deschise când se face un apel spawn rămân deschise în procesul copil.
Prototip
int spawnl(int mode, char *path, char *arg0, ...);int spawnle(int mode, char *path, char *arg0, ..., char ** envp);int spawnlp(int mode, char *path, char *arg0, ...);int spawnlpe(int mode, char *path, char *arg0, ..., char ** envp);int spawnv(int mode, char *path, char **argv);int spawnve(int mode, char *path, char **argv, char ** envp);int spawnvp(int mode, char *path, char **argv);int spawnvpe(int mode, char *path, char **argv, char ** envp);
Numele funcțiilor
Numele de bază al fiecărei funcții este generat , urmat de una sau mai multe litere:
| Scrisoare | Note |
|---|---|
| l | Argumentele liniei de comandă sunt transmise individual funcției. |
| v | Argumentele liniei de comandă sunt transmise funcției ca o matrice de indicatori. |
| p | Folosește variabila argument PATH pentru a găsi fișierul de executat. |
| e | O serie de indicatori pentru argumentele de mediu este transmisă în mod explicit procesului copil. |
Mod
Modul Argumentul determină modul în care copilul este rulat. Valorile modului sunt:
| Nume | Note |
|---|---|
| P_OVERLAY | Suprapune procesul părinte cu copilul, care distruge părintele. Acest lucru are același efect ca funcțiile exec *. |
| P_WAIT | Suspendă procesul părinte până când procesul copil a terminat de executat (spawn sincron). |
| P_NOWAIT, P_NOWAITO | Continuă să execute procesul de apelare concomitent cu noul proces (spawn asincron). |
| P_DETACH | copilul este rulat în fundal fără acces la consolă sau tastatură. Apelurile pentru a _ aștepta la noul proces vor eșua (reproducere asincronă) |
cale
Calea argument specifică numele fișierului programului pentru a executa. Numai pentru spawnlp și spawnvp , dacă numele fișierului nu are o cale și nu se află în directorul curent, variabila de mediu PATH determină ce directoare să caute fișierul. Șirul indicat de argv [0] este numele programului de rulat.
Linia de comandă transmisă programului generat este alcătuită din șirurile de caractere, arg0 prin argn , în apelul spawn . Lungimea maximă combinată acceptată a acestor șiruri diferă între compilatoare, variind de la 128 de caractere pe Digital Mars până la 1024 pe Microsoft Visual C ++ sau cât permite memoria, pe DJGPP. Ultimul argument după argn trebuie să fie un pointer NULL.
argv
Argv Argumentul este o serie de indicii de caracter. Ultimul indicator din matrice trebuie să fie nul pentru a indica sfârșitul listei.
invp
The spawnle , spawnlpe , spawnve și spawnvpe apelurilor permit utilizatorului să modifice mediul procesului copilului prin trecerea unei liste de setări de mediu în envp argumentul. Acest argument este o serie de indicatori de caractere; fiecare pointer (cu excepția ultimului) indică un șir terminat nul care definește o variabilă de mediu. O variabilă de mediu are forma:
name=value
unde nume este numele variabilei și valoarea este valoarea acesteia. Ultimul indicator din matrice este nul. Când argumentul envp este nul, copilul moștenește setările de mediu ale părintelui.
Sub Microsoft Windows, funcțiile spawn * folosesc LoadModule pentru a rula procesul generat; și dacă acest lucru eșuează, se încearcă crearea unui proces MS-DOS normal. Dacă apare o aplicație Windows, mânerul de instanță poate fi obținut folosind exec_instancehandleget . Este posibil să specificați modul în care programul generat va fi afișat utilizând funcțiile _exec_showset , _exec_showget și _exec_showreset .
Returnează valorile
Valoarea returnată indică starea de ieșire a programului generat. O valoare zero indică faptul că programul generat a fost executat cu succes. O valoare pozitivă indică faptul că programul generat a fost executat, dar a fost întrerupt sau terminat din greșeală, valoarea returnată este starea de ieșire a procesului copil. O valoare negativă indică faptul că programul generat nu s-a executat și este setat errno. Sub Microsoft Windows, spawn returnează codul de eroare negat returnat din LoadModule pentru compatibilitate cu biblioteca de execuție C. Pot fi întâlnite următoarele coduri de eroare:
| Valoare | Note |
|---|---|
-2 |
Fișierul nu a fost găsit |
-3 |
Calea nu a fost găsită |
-11 |
Fișier .exe nevalid (pentru Windows) |
-13 |
Aplicația DOS 4. 0 |
-14 |
Tipul .exe necunoscut (poate fi extins DOS) |
Funcțiile POSIX generează
The și fratele său posix_spawnppot fi folosiți ca înlocuitori pentru furcă și exec , dar nu oferă aceeași flexibilitate ca forkși utilizarea și execseparat. Ele pot fi înlocuitoare eficiente pentru forkși exec, dar scopul lor este de a furniza primitive de creare a proceselor în medii încorporate unde forknu este acceptat din cauza lipsei de traducere dinamică a adreselor .
Istorie
Icrelor metafora, și anume, pentru a produce urmasi ca în depunerea de ou, a avut utilizarea sa timpurie în VMS, acum OpenVMS , sistemul (1977) de operare. În mediul academic, a existat o dezbatere aprinsă între susținătorii Unix furca (copie brută de aspect de memorie, dar rapid) , comparativ cu VMS miceliu (construcție fiabilă a parametrilor de proces, dar mai lent). Această dezbatere a reînviat atunci când mecanismul de reproducere VMS a fost moștenit de Windows NT (1993).