9.1.4.2. Π€ΡΠ½ΠΊΡΠΈΠΈ-ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΈ:
execl()
ΠΈ Π΄Ρ.
ΠΡΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ
ΡΡΠ½ΠΊΡΠΈΠΉ, Π΄Π΅ΠΉΡΡΠ²ΡΡΡΠΈΡ
Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΎΠ±ΠΎΠ»ΠΎΡΠ΅ΠΊ, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΠ΄ΠΎΠ±Π½ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ Π΄Π»Ρ
execve()
. Π ΠΏΠ΅ΡΠ²ΠΎΠΉ Π³ΡΡΠΏΠΏΠ΅ Π²ΡΠ΅ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΡΠΏΠΈΡΠΎΠΊ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ², ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ
ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ Π² Π²ΠΈΠ΄Π΅ ΡΠ²Π½ΠΎΠ³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΠΈ:
int execl(const char *path, const char *arg, ...)
ΠΠ΅ΡΠ²ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ,
path
, ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΡΠ΅ΠΌ ΠΊ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠΎΠΌΡ ΡΠ°ΠΉΠ»Ρ. ΠΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ, Π½Π°ΡΠΈΠ½Π°Ρ Ρ
arg
, ΡΠ²Π»ΡΡΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΌΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½Ρ Π²
argv
. ΠΠ°ΠΊ ΠΈ ΡΠ°Π½Π΅Π΅, ΡΠ²Π½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π²ΠΊΠ»ΡΡΠ΅Π½
argv[0]
. ΠΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π·Π°Π²Π΅ΡΡΠ°ΡΡΠΈΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ
NULL
, ΡΡΠΎΠ±Ρ
execl()
ΡΠΌΠΎΠ³Π»Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ, Π³Π΄Π΅ Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°Π΅ΡΡΡ ΡΠΏΠΈΡΠΎΠΊ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ². ΠΠΎΠ²Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π½Π°ΡΠ»Π΅Π΄ΡΠ΅Ρ Π»ΡΠ±ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π°Ρ
ΠΎΠ΄ΡΡΡΡ Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ
environ
.
int execlp(const char *file, const char *arg, ...)
ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΠΏΠΎΠ΄ΠΎΠ±Π½Π°
execl()
, Π½ΠΎ ΠΎΠ½Π° ΠΈΠΌΠΈΡΠΈΡΡΠ΅Ρ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌ ΠΏΠΎΠΈΡΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΈ, ΡΠ°Π·ΡΡΠΊΠΈΠ²Π°Ρ
file
Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅, ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ
PATH
. ΠΡΠ»ΠΈ
file
ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠΈΠΌΠ²ΠΎΠ»
/
, ΡΡΠΎΡ ΠΏΠΎΠΈΡΠΊ Π½Π΅ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ. ΠΡΠ»ΠΈ
PATH
Π² ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠΈ Π½Π΅ ΠΏΡΠΈΡΡΡΡΡΠ²ΡΠ΅Ρ,
execlp()
ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΏΡΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ. Π GNU/Linux ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ "
:/bin:/usr/bin
", Π½ΠΎ Π² Π΄ΡΡΠ³ΠΈΡ
ΡΠΈΡΡΠ΅ΠΌΠ°Ρ
ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π΄ΡΡΠ³ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅. (ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Π²Π΅Π΄ΡΡΠ΅Π΅ Π΄Π²ΠΎΠ΅ΡΠΎΡΠΈΠ΅ Π²
PATH
ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ
ΡΠ½Π°ΡΠ°Π»Π° ΠΏΠΎΠΈΡΠΊ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ Π² ΡΠ΅ΠΊΡΡΠ΅ΠΌ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅.)
ΠΠΎΠ»Π΅Π΅ ΡΠΎΠ³ΠΎ, Π΅ΡΠ»ΠΈ ΡΠ°ΠΉΠ» Π½Π°ΠΉΠ΄Π΅Π½ ΠΈ ΠΈΠΌΠ΅Π΅Ρ ΠΏΡΠ°Π²ΠΎ Π΄ΠΎΡΡΡΠΏΠ° Π½Π° ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, Π½ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ ΠΈΠ·-Π·Π° ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π½Π΅ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ Π΅Π³ΠΎ ΡΠΎΡΠΌΠ°Ρ,
execlp()
ΡΡΠΈΡΠ°Π΅Ρ, ΡΡΠΎ ΡΡΠΎ ΡΡΠ΅Π½Π°ΡΠΈΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΈ ΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΡ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΡΠ°ΠΉΠ»Π° Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°.
int execle(const char *path, const char *arg, ...,
Β char *const envp[])
ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄ΠΎΠ±Π½Π°
execl()
, Π½ΠΎ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ,
envp
, ΠΊΠΎΡΠΎΡΡΠΉ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π½ΠΎΠ²ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. ΠΠ°ΠΊ ΠΈ Π² ΡΠ»ΡΡΠ°Π΅ Ρ
execl()
, Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ Π΄Π»Ρ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΡΠΏΠΈΡΠΊΠ° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΠΏΠΎΠΌΠ΅ΡΡΠΈΡΡ ΠΏΠ΅ΡΠ΅Π΄
envp
ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ
NULL
.
ΠΡΠΎΡΠ°Ρ Π³ΡΡΠΏΠΏΠ° ΡΡΠ½ΠΊΡΠΈΠΉ-ΠΎΠ±ΠΎΠ»ΠΎΡΠ΅ΠΊ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΌΠ°ΡΡΠΈΠ² Π² ΡΡΠΈΠ»Π΅
argv
:
int execv(const char *path, char *const argv[])
ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΠΏΠΎΠ΄ΠΎΠ±Π½Π°
execve()
, Π½ΠΎ Π½ΠΎΠ²Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π½Π°ΡΠ»Π΅Π΄ΡΠ΅Ρ Π»ΡΠ±ΠΎΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ environ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.
int execvp(const char *file, char *const argv[])
ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΠΏΠΎΠ΄ΠΎΠ±Π½Π°
execv()
, Π½ΠΎ ΠΎΠ½Π° ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅Ρ ΡΠ°ΠΊΠΎΠΉ ΠΆΠ΅ ΠΏΠΎΠΈΡΠΊ Π²
PATH
, ΠΊΠ°ΠΊ ΠΈ ΡΡΠ½ΠΊΡΠΈΡ
execlp()
. ΠΠ½Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΈΡ Π½Π° ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΡΠ΅Π½Π°ΡΠΈΡ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΈ, Π΅ΡΠ»ΠΈ Π½Π°ΠΉΠ΄Π΅Π½Π½ΡΠΉ ΡΠ°ΠΉΠ» Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ.
Π ΡΠ°Π±Π». 9.1 ΠΏΠΎΠ΄Π²Π΅Π΄Π΅Π½Ρ ΠΈΡΠΎΠ³ΠΈ Π΄Π»Ρ ΡΠ΅ΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΉ
exec()
.
Π’Π°Π±Π»ΠΈΡΠ° 9.1. Π‘Π²ΠΎΠ΄ΠΊΠ° ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΉ
exec()
ΠΏΠΎ Π°Π»ΡΠ°Π²ΠΈΡΡ
| Π€ΡΠ½ΠΊΡΠΈΡ | ΠΠΎΠΈΡΠΊ ΠΏΡΡΠΈ | ΠΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ | ΠΠ°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ |
execl()
| | β | ΠΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΠΏΠΈΡΠΎΠΊ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ². |
execle()
| | | ΠΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΠΏΠΈΡΠΎΠΊ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² Ρ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ΠΌ. |
execlp()
| β | β | ΠΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΠΏΠΈΡΠΎΠΊ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² Ρ ΠΏΠΎΠΈΡΠΊΠΎΠΌ ΠΏΡΡΠΈ |
execv()
| | β | ΠΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Ρ argv
|
execve()
| | | ΠΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Ρ argv ΠΈ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ΠΌ (ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ²). |
execvp()
| β | β | ΠΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Ρ argv ΠΈ Ρ ΠΏΠΎΠΈΡΠΊΠΎΠΌ ΠΏΡΡΠΈ |
Π€ΡΠ½ΠΊΡΠΈΠΉ
execlp()
ΠΈ
execvp()
Π»ΡΡΡΠ΅ ΠΈΠ·Π±Π΅Π³Π°ΡΡ, Π΅ΡΠ»ΠΈ Π²Ρ Π½Π΅ Π·Π½Π°Π΅ΡΠ΅, ΡΡΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ
PATH
ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΏΡΠΈΠ΅ΠΌΠ»Π΅ΠΌΡΠΉ ΡΠΏΠΈΡΠΎΠΊ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ².
9.1.4.3. ΠΠΌΠ΅Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ ΠΈ
argv[0]
ΠΠΎ ΡΠΈΡ
ΠΏΠΎΡ ΠΌΡ Π²ΡΠ΅ Π²ΡΠ΅ΠΌΡ ΡΡΠΈΡΠ°Π»ΠΈ
argv[0]
ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. ΠΡ Π·Π½Π°Π΅ΠΌ, ΡΡΠΎ ΠΎΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ, Π° ΠΌΠΎΠΆΠ΅Ρ ΠΈ Π½Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΡΠΈΠΌΠ²ΠΎΠ»
/
, Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠΏΠΎΡΠΎΠ±Π° Π²ΡΠ·ΠΎΠ²Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π΅ΡΠ»ΠΈ ΡΡΠΎΡ ΡΠΈΠΌΠ²ΠΎΠ» ΡΠΎΠ΄Π΅ΡΠΆΠΈΡΡΡ, ΡΡΠΎ Ρ
ΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠ° ΠΊ ΡΠΎΠΌΡ, ΡΡΠΎ Π΄Π»Ρ Π²ΡΠ·ΠΎΠ²Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΎΡΡ ΠΈΠΌΡ ΠΏΡΡΠΈ.
ΠΠ΄Π½Π°ΠΊΠΎ, ΠΊΠ°ΠΊ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΡΡΠ½ΠΎ ΠΊ ΡΡΠΎΠΌΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΡΠΎ, ΡΡΠΎ
argv[0]
ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π°, ΡΠ²Π»ΡΠ΅ΡΡΡ
Π»ΠΈΡΡ ΡΠΎΠ³Π»Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ. ΠΠΈΡΡΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π²ΠΎΡΠΏΡΠ΅ΠΏΡΡΡΡΠ²ΠΎΠ²Π°ΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ Π²Π°ΠΌΠΈ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅
argv[0]
ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ. Π‘Π»Π΅Π΄ΡΡΡΠ°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°,
ch09-run.c
, Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ:
1Β /* ch09-run.c --- Π·Π°ΠΏΡΡΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Ρ Π΄ΡΡΠ³ΠΈΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΈ Π»ΡΠ±ΡΠΌΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ */
2
3Β #include <stdio.h>
4Β #include <errno.h>
5 Β #include <unistd.h>
6
7Β /* main --- Π½Π°ΡΡΡΠΎΠΈΡΡ argv ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ ΡΠΊΠ°Π·Π°Π½Π½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ */
8
9Β int main(int argc, char **argv)
10 {
11Β char *path;