Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Linux ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 115

Автор Роббинс ΠΡ€Π½ΠΎΠ»ΡŒΠ΄

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;