Kniga-Online.club
» » » » Основы программирования в Linux - Мэтью Нейл

Основы программирования в Linux - Мэтью Нейл

Читать бесплатно Основы программирования в Linux - Мэтью Нейл. Жанр: Интернет год 2004. Так же читаем полные версии (весь текст) онлайн без регистрации и SMS на сайте kniga-online.club или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Перейти на страницу:

<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 execlpn&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 байтов.

Перейти на страницу:

Мэтью Нейл читать все книги автора по порядку

Мэтью Нейл - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки kniga-online.club.


Основы программирования в Linux отзывы

Отзывы читателей о книге Основы программирования в Linux, автор: Мэтью Нейл. Читайте комментарии и мнения людей о произведении.


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор kniga-online.


Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*