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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² LinuxΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 204

Автор ΠœΡΡ‚ΡŒΡŽ НСйл

<b>#include &lt;unistd.h&gt;</b>

<b>char **environ;</b>

<b>int execl(const char *path, const char *arg0, ..., (char *)0);</b>

<b>int execlp(const char *file, const char *arg0, ..., (char *)0);</b>

<b>int execle(const char *path, const char *arg0, ..., (char *)0,</b>

<b>Β char *const envp[]);</b>

<b>int execv(const char *path, char *const argv[]);</b>

<b>int execvp(const char *file, char *const argv[]);</b>

<b>int execve(const char *path, char *const argv[], char *const envp[]);</b>

Π­Ρ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ дСлятся Π½Π° Π΄Π²Π° Π²ΠΈΠ΄Π°.

execl
,
execlp
ΠΈ
execle
ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ число Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΡ…ΡΡ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ
null
. Π£
execv
ΠΈ
execvp
Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ β€” массив строк. Π’ ΠΎΠ±ΠΎΠΈΡ… случаях новая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° стартуСт с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ, прСдставлСнными Π² массивС
argv
, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
main
.

Π­Ρ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, с использованиСм

execve
, хотя Π½Π΅Ρ‚ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ Π½Π° этот счСт.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈΠΌΠ΅Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… содСрТат суффикс

p
, ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΈΡ‰ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ окруТСния
PATH
для опрСдСлСния исполняСмого Ρ„Π°ΠΉΠ»Π° Π½ΠΎΠ²ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Если эта пСрСмСнная Π½Π΅ позволяСт Π½Π°ΠΉΡ‚ΠΈ Π½ΡƒΠΆΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ΅ имя Ρ„Π°ΠΉΠ»Π°, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ.

ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠΎΠΆΠ΅Ρ‚ глобальная пСрСмСнная

environ
. Π”Ρ€ΡƒΠ³ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ β€” Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π² функциях
execle
ΠΈ
execve
, способный ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ строки, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΊΠ°ΠΊ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ

exec
для запуска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹
ps
, ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ Π»ΡŽΠ±ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ· сСмСйства
exec
, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² Π²Ρ‹Π·ΠΎΠ²Π°Ρ… ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π΄Π°Π»Π΅Π΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°:

#include &lt;unistd.h&gt;

/* ΠŸΡ€ΠΈΠΌΠ΅Ρ€ списка Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² */

/* Π£Ρ‡Ρ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ для argv[0] Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ имя ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ */

char *const ps_argv[] = {&quot;ps&quot;, &quot;ax&quot;, 0};

/* He слишком ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ окруТСния */

char *const ps_envp[] = {&quot;PATH=/bin:/usr/bin&quot;, &quot;TERM=console&quot;, 0};

/* Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ exec */

execl(&quot;/bin/ps&quot;, &quot;ps&quot;, &quot;ax&quot;, 0);

/* прСдполагаСтся, Ρ‡Ρ‚ΠΎ ps Π² /bin */

execlp(&quot;ps&quot;, &quot;ps&quot;, &quot;ax&quot;, 0);

/* прСдполагаСтся, Ρ‡Ρ‚ΠΎ /bin Π² PATH */

execle(&quot;/bin/ps&quot;, &quot;ps&quot;, &quot;ax&quot;, 0, ps_envp);

/* пСрСдаСтся своС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ */

execv(&quot;/bin/ps&quot;, ps_argv);

execvp(&quot;ps&quot;, ps_argv);

execve(&quot;/bin/ps&quot;, ps_argv, ps_envp);

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 11.2.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 11.2. Ѐункция
execlp

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π²Ρ‹Π·ΠΎΠ²

execlp
:

#include &lt;unistd.h&gt;

#include &lt;stdio.h&gt;

#include &lt;stdlib.h&gt;

int main() {

<i>Β printf(&quot;Running ps with execlp\n&quot;);</i>

<i>Β execlp(&quot;ps&quot;, &quot;ps&quot;, &quot;ax&quot;, 0);</i>

Β printf(&quot;Done.\n&quot;);

Β exit(0);

}

Когда Π²Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ эту ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, рСхСс.с, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

ps
, Π½ΠΎ Π±Π΅Π· сообщСния
Done
. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π² Π²Ρ‹Π²ΠΎΠ΄Π΅ Π½Π΅Ρ‚ процСсса с ΠΈΠΌΠ΅Π½Π΅ΠΌ
рСхСс
:

$ <b>./рСхСс</b>

Running ps with execlp

Β PID TTYΒ Β  STATΒ TIME COMMAND

1Β Β Β  ?Β Β Β  Β SΒ Β  Β 0:03 init [5]

...

1262 pts/1Β SsΒ Β  0:00 /bin/bash

1273 pts/2Β SΒ Β Β  0:00 su -

1274 pts/2Β S+Β Β  0:00 -bash

1463 pts/1Β SNΒ Β  0:00 oclock

1465 pts/1Β SΒ Β Β  0:01 emacs Makefile

1514 pts/1Β R+Β Β  0:00 ps ax

Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ сообщСниС ΠΈ Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ

execlp
, которая ΠΈΡ‰Π΅Ρ‚ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ, Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ окруТСния
PATH
для обнаруТСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹
ps
. Π”Π°Π»Π΅Π΅ ΠΎΠ½Π° выполняСт ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ вмСсто ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹
рСхСс
, запустив Π΅Π΅ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ Π²Ρ‹ Π²Π²Π΅Π»ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ

$ <b>ps ax</b>

Когда

ps
Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ Π½ΠΎΠ²ΡƒΡŽ строку ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ. Π’ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ
рСхСс
Π½Π΅ происходит, поэтому Π²Ρ‚ΠΎΡ€ΠΎΠ΅ сообщСниС Π½Π΅ выводится. PID Π½ΠΎΠ²ΠΎΠ³ΠΎ процСсса Ρ‚ΠΎΡ‚ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ Ρƒ исходного, Ρ‚ΠΎ ΠΆΠ΅ самоС ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎ PID Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ процСсса ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ
nice
. Π’ сущности, происходит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅: Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π°ΡΡΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° запустила Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΈ Π½ΠΎΠ²Ρ‹ΠΉ исполняСмый Ρ„Π°ΠΉΠ», Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ Π² Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
exec
.

БущСствуСт ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ для ΠΎΠ±Ρ‰Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° списка Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ окруТСния процСсса, запускаСмого функциями

exec
. Оно задаСтся Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ
ARG_MAX
ΠΈ Π² систСмах Linux Ρ€Π°Π²Π½ΠΎ 128 ΠšΠ±Π°ΠΉΡ‚. Π’ Π΄Ρ€ΡƒΠ³ΠΈΡ… систСмах ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒΡΡ мСньший ΠΏΡ€Π΅Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎ способно ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ POSIX гласит, Ρ‡Ρ‚ΠΎ
ARG_MAX
Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ 4096 Π±Π°ΠΉΡ‚ΠΎΠ².