ÈÌß
execl, execv, execle, execve, execlp, execvp - âûïoëíeíèe
ôaéëa
ÑÈÍÒÀÊÑÈÑ
int execl (path, arg0, arg1, ..., argn, (char*)0) char *path, *arg0, *arg1, ..., *argn; int execv (path, argv) char *path, *argv[]; int execle (path, arg0, arg1, ..., argn, (char*)0, envp) char *path, *arg0, *arg1,..., *argn, *envp[]; int execve (path, argv, envp) char *path, *argv[], *envp[]; int execlp (file, arg0, arg1, ..., argn, (char*)0) char *file, *arg0, *arg1,..., *argn; int execvp (file, argv) char *file, *argv[];
ÎÏÈÑÀÍÈÅ
Ôyíêöèè ceìeécòâa exec çaìeíÿþò òeêyùèé oápaç ïpoöecca íoâûì
oápaçoì. Hoâûé oápaç èçâëeêaeòcÿ èç oáúeêòíoão ôaéëa,
íaçûâaeìoão ôaéëoì oápaça ïpoöecca. Ïocëe ycïeøíoão
âûïoëíeíèÿ âûçoâa exec íeâoçìoæeí âoçâpaò â còapûé oápaç
ïpoöecca, ïocêoëüêy oí ïepeêpûò íoâûì oápaçoì.
Apãyìeíò path çaäaeò èìÿ ôaéëa, coäepæaùeão íoâûé oápaç ïpoöecca.
Apãyìeíò file òaêæe çaäaeò èìÿ ôaéëa, coäepæaùeão íoâûé oápaç ïpoöecca. Ecëè apãyìeíò file íe coäepæèò cèìâoë /, ïpeôèêc èìeíè ýòoão ôaéëa ïoëy÷aeòcÿ ïocëeäoâaòeëüíoé ïoäcòaíoâêoé èìeí êaòaëoãoâ, yêaçaííûx â çía÷eíèè ïepeìeííoé PATH (cì. environ(7)). Koìaíäíaÿ cpeäa ôopìèpyeòcÿ èíòepïpeòaòopoì êoìaíä (cì. sh(1)).
Apãyìeíòû arg0, arg1, ..., argn ÿâëÿþòcÿ yêaçaòeëÿìè ía còpoêè cèìâoëoâ, çaâepøaeìûe cèìâoëoì NUL. Còpoêè ïpeäcòaâëÿþò coáoé cïècoê apãyìeíòoâ, ïepeäaâaeìûx íoâoìy oápaçy ïpoöecca. Apãyìeíò arg0 äoëæeí ïpècyòcòâoâaòü âceãäa è äoëæeí yêaçûâaòü ía còpoêy, ëèáo coâïaäaþùyþ c path, ëèáo coäepæaùyþ ïocëeäíèé êoìïoíeíò path.
Apãyìeíò argv ÿâëÿeòcÿ ìaccèâoì yêaçaòeëeé ía cèìâoëüíûe còpoêè, çaâepøaeìûe cèìâoëoì NUL. Còpoêè ïpeäcòaâëÿþò coáoé cïècoê apãyìeíòoâ, ïepeäaâaeìûx íoâoìy oápaçy ïpoöecca. Apãyìeíò argv[0] äoëæeí ïpècyòcòâoâaòü âceãäa è äoëæeí yêaçûâaòü ía còpoêy, ëèáo coâïaäaþùyþ c path, ëèáo coäepæaùyþ ïocëeäíèé êoìïoíeíò path.
Apãyìeíò envp ÿâëÿeòcÿ ìaccèâoì yêaçaòeëeé ía cèìâoëüíûe còpoêè, çaâepøaeìûe cèìâoëoì NUL. Còpoêè ïpeäcòaâëÿþò coáoé êoìaíäíyþ cpeäy äëÿ íoâoão oápaça ïpoöecca. Ïocëeäíèé ýëeìeíò ìaccèâa äoëæeí áûòü íyëeâûì yêaçaòeëeì.
Ôaéëû, oòêpûòûe còapûì (âûçûâaþùèì) oápaçoì ïpoöecca, ocòaþòcÿ oòêpûòûìè è â íoâoì oápaçe ça ècêëþ÷eíèeì òex, y êoòopûx ôëaã çaêpûòèÿ ïpè exec paâeí 1; (cì. fcntl(3)). Óêaçaòeëü ïoçèöèè â òex ôaéëax, ÷òo ocòaþòcÿ oòêpûòûìè, íe èçìeíÿeòcÿ.
Cèãíaëû, ía êoòopûe â còapoì oápaçe ïpoöecca áûëa ycòaíoâëeía còaíäapòíaÿ peaêöèÿ (SIG_DFL) èëè èãíopèpoâaíèe (SIG_IGN), ocòaþòcÿ òaêèìè æe â íoâoì oápaçe. Ha cèãíaëû, êoòopûe â còapoì oápaçe áûëè oáúÿâëeíû ïepexâaòûâaeìûìè, â íoâoì oápaçe ycòaíaâëèâaeòcÿ còaíäapòíaÿ peaêöèÿ cècòeìû (cì. signal(3)).
Ecëè áèò ycòaíoâêè ïoëüçoâaòeëücêoão ID y ôaéëa oápaça ïpoöecca paâeí 1 (cì. chmod(2)), ýôôeêòèâíûé ïoëüçoâaòeëücêèé ID ïpoöecca c íoâûì oápaçoì ïoëaãaeòcÿ paâíûì ïoëüçoâaòeëücêoìy ID ôaéëa. Aíaëoãè÷ío, ecëè áèò ycòaíoâêè ãpyïïoâoão ID y ôaéëa oápaça ïpoöecca paâeí 1, ýôôeêòèâíûé ãpyïïoâoé ID ïpoöecca c íoâûì oápaçoì ïoëaãaeòcÿ paâíûì ãpyïïoâoìy ID ôaéëa. Peaëüíûe ïoëüçoâaòeëücêèé è ãpyïïoâoé IDs ïpoöecca ocòaþòcÿ íeèçìeííûìè.
Ïpoôèëèpoâaíèe ïocëe exec çaïpeùeío (cì. profil(2)).
Hoâûé oápaç ïpoöecca íacëeäyeò oò còapoão oápaça ïo êpaéíeé ìepe, cëeäyþùèe aòpèáyòû:
ïoëüçoâaòeëücêyþ äoáaâêy ê ïpèopèòeòy ïpoöecca (cì. nice(2)) ID ïpoöecca ID ïpoöecca-oòöa ID ãpyïïû ïpoöeccoâ çía÷eíèÿ ceìaôopoâ (cì. semop(2)) ID òepìèíaëüíoé ãpyïïû (cì. exit(2) è signal(3)) ôëaã òpaccèpoâêè (cì. ptrace(2), çaïpoc 0) òaéìep ïpoöecca (cì. alarm(2)) òeêyùèé êaòaëoã êopíeâoé êaòaëoã ìacêy êoäa çaùèòû (cì. umask(2)) ìaêcèìaëüíûé paçìep ôaéëa (cì. ulimit(2)) tms_utime, tms_stime, tms_cutime, tms_cstime (cì. times(2)).
B ïpoãpaììax ía ÿçûêe Cè äëÿ peaëèçaöèè âûçoâa exec ìoæío ïoëüçoâaòücÿ ôyíêöèÿìè execl è execv. Ôyíêöèÿ execl ïpèìeíÿeòcÿ òoãäa, êoãäa èìÿ âûïoëíÿeìoão ôaéëa è ïepeäaâaeìûe apãyìeíòû èçâecòíû çapaíee; oíè yêaçûâaþòcÿ â âèäe cèìâoëüíûx còpoê - apãyìeíòoâ ôyíêöèè. Ïo coãëaøeíèþ, ïepâûé apãyìeíò äoëæeí coâïaäaòü ëèáo c èìeíeì ôaéëa, ëèáo c ïocëeäíèì êoìïoíeíòoì ýòoão èìeíè. Ïocëeäíèì apãyìeíòoì â cïècêe äoëæeí áûòü íyëeâoé yêaçaòeëü.
Ôyíêöèÿ execv ïpèìeíÿeòcÿ, êoãäa çapaíee íeèçâecòío ÷ècëo apãyìeíòoâ. Apãyìeíòaìè â ýòoì cëy÷ae ÿâëÿþòcÿ èìÿ ôaéëa è ìaccèâ còpoê, coäepæaùèx ïepeäaâaeìûe ôaéëy apãyìeíòû. Ïocëeäíèì ýëeìeíòoì ìaccèâa äoëæeí áûòü íyëeâoé yêaçaòeëü.
Ïpoãpaììa ía ÿçûêe Cè, ïoëy÷aþùaÿ yïpaâëeíèe â peçyëüòaòe exec, äoëæía èìeòü cëeäyþùèì oápaçoì oïècaííûé âxoä:
void main (argc, argv, envp) int argc; char **argv, **envp;ãäe argc - c÷eò÷èê ÷ècëa apãyìeíòoâ;
argc äoëæeí áûòü, ïo êpaéíeé ìepe, íe ìeíüøe 1 è argv[0] äoëæeí coâïaäaòü c èìeíeì èëè ïocëeäíèì êoìïoíeíòoì èìeíè ôaéëa.
argv ìoæeò íeïocpeäcòâeíío ècïoëüçoâaòücÿ â äpyãoì execv, ïocêoëüêy argv[argc] paâeí 0.
Kaæäaÿ còpoêa â ìaccèâe, yêaçûâaeìoì envp, cocòoèò èç èìeíè, çíaêa "=" è çía÷eíèÿ (cèìâoëüíoé còpoêè, çaâepøaeìoé cèìâoëoì NUL). Maccèâ çaâepøaeòcÿ íyëeâûì yêaçaòeëeì. Èíòepïpeòaòop êoìaíä sh(1) ïepeäaeò âûçûâaeìoé ïpoãpaììe â êa÷ecòâe êoìaíäíoé cpeäû èìeía è çía÷eíèÿ êoìaíäíûx ïepeìeííûx, oáúÿâëeííûx ýêcïopòèpyeìûìè. Cïècoê oáû÷ío ýêcïopòèpyeìûx èìeí cì. â environ(7). Ïpè âûçoâe ïpoãpaììû çía÷eíèe envp ïpècâaèâaeòcÿ âíeøíeé ïepeìeííoé environ, êoòopaÿ ècïoëüçyeòcÿ execv è execl äëÿ ïepeäa÷è êoìaíäíoé cpeäû ëþáoé ïoäïpoãpaììe äaííoé ïpoãpaììû. Ïepe÷ècëeííûe íèæe ôyíêöèè ÿâíûì oápaçoì ïepeäaþò êoìaíäíyþ cpeäy:
execle (file, arg0, arg1, ..., argn, 0, environ); execve (file, argv, environ);
execlp è execvp âûçûâaþòcÿ c òeìè æe apãyìeíòaìè, ÷òo execl è execv, ío èùyò èìÿ ôaéëa, ïpocìaòpèâaÿ êaòaëoãè òaê æe, êaê sh(1). Cïècoê êaòaëoãoâ áepeòcÿ èç êoìaíäíoé cpeäû.
exec aâapèéío çaâepøaeòcÿ è âoçâpaùaeò yïpaâëeíèe â còapûé oápaç ïpoöecca, ecëè âûïoëíÿeòcÿ xoòÿ áû oäío èç cëeäyþùèx ycëoâèé:
[ENOENT] | Koìïoíeíò èìeíè ôaéëa oápaça ïpoöecca íe cyùecòâyeò. |
---|---|
[ENOTDIR] | Koìïoíeíò ïpeôèêca èìeíè ôaéëa oápaça ïpoöecca íe ÿâëÿeòcÿ êaòaëoãoì. |
[EACCES] | Ëèáo íeò paçpeøeíèÿ ía ïoècê â êaòaëoãe èç ïpeôèêca èìeíè ôaéëa oápaça ïpoöecca. |
[EACCES] | Ôaéë oápaça ïpoöecca íe ÿâëÿeòcÿ oáû÷íûì. |
[EACCES] | Heò paçpeøeíèÿ ía âûïoëíeíèe ôaéëa oápaça ïpoöecca. |
[ENOEXEC] | Ôaéë oápaça ïpoöecca èìeeò paçpeøeíèe ía âûïoëíeíèe, ío eão ôopìaò íe coâïaäaeò c ôopìaòoì oáúeêòíoão ôaéëa. |
[ETXTBSY] | Hoâûé ôaéë oápaça ïpoöecca ÿâëÿeòcÿ ÷ècòoé ïpoöeäypoé (paçäeëÿeìûì ceãìeíòoì èícòpyêöèé), êoòopûé â äaííûé ìoìeíò oòêpûò ía çaïècü äpyãèì ïpoöeccoì. |
[ENOMEM] | Hoâûé oápaç ïpoöecca òpeáyeò ïaìÿòè áoëüøe, ÷eì eìy ìoæeò áûòü âûäeëeío â oïepaòèâíoé ïaìÿòè èëè â oáëacòè câoïèíãa. |
[E2BIG] | ×ècëo áaéòoâ â cïècêe apãyìeíòâ, ïepeäaâaeìûx íoâoìy oápaçy, ïpeâûøaeò ïpeäycìoòpeííûé cècòeìoé ëèìèò â 512 áaéòoâ. |
[EFAULT] | Äëèía íoâoão ôaéëa oápaça íe coâïaäaeò c yêaçaííoé â çaãoëoâêe. |
[EFAULT] | Aäpec, çaäaííûé path, argv èëè envp, âûxoäèò ça ïpeäeëû ïoëüçoâaòeëücêoão aäpecíoão ïpocòpaícòâa ïpoöecca. |
BOÇÂPAÙAEÌOE ÇÍA×EÍÈE
B cëy÷ae ycïeøíoão çaâepøeíèÿ íe ïpoècxoäèò âoçâpaòa
yïpaâëeíèÿ è çía÷eíèÿ â còapûé oápaç ïpoöecca. Èía÷e
yïpaâëeíèe âoçâpaùaeòcÿ â còapûé oápaç, âoçâpaùaeòcÿ
çía÷eíèe -1 è â errno çaíocèòcÿ êoä oøèáêè.
ÑÌ. ÒÀÊÆÅ
exit(3), fork(3), proctl(3), semop(3)
ÇÀÌÅ×ÀÍÈß
exec ìoæeò aâapèéío çaâepøèòücÿ, ecëè oáúeì oïepaòèâíoé
ïaìÿòè ïpeâûøaeò paçìep oáëacòè câoïèíãa (cì. âûøe êoä
oøèáêè ENOMEM). Oäíaêo, ýòo oãpaíè÷eíèe cíèìaeòcÿ
ècïoëüçoâaíèeì cëeäyþùèx âapèaíòoâ âûçoâa proctl(3):
PRHUGEX | Ïoçâoëÿeò âûïoëíÿòü ïpoãpaììy äaæe, ecëè ee paçìep ïpeâûøaeò paçìep oáëacòè câoïèíãa. Taêèe ïpoãpaììû äoëæíû ïoìeùaòücÿ â äocòyïíyþ ÷acòü oïepaòèâíoé ïaìÿòè è ýôôeêòèâíûé ïoëüçoâaòeëücêèé ID ïpoöecca äoëæeí áûòü ïpèâèëeãèpoâaííûì. Ïpoöecc, âûïoëíÿþùèé ïpoãpaììy òaêoão paçìepa, áëoêèpyeòcÿ cècòeìoé oò âûãpyçêè â oáëacòü câoïèíãa. |
---|---|
PRNORMX | Çaïpeùaeò ïpoöeccy âûïoëíÿòü ïpoãpaììy ïoäoáíoão paçìepa. Ýòoò âûçoâ ìoæeò cäeëaòü ëþáoé ïpoöecc. |