Чтение онлайн

на главную - закладки

Жанры

Основы программирования в Linux
Шрифт:

int execv(const char *path, char *const argv[]);

int execvp(const char *file, char *const argv[]);

int execve(const char *path, char *const argv[], char *const envp[]);

Эти функции делятся на два вида.

execl
,
execlp
и
execle
принимают переменное число аргументов, заканчивающихся указателем
null
. У
execv
и
execvp
второй аргумент — массив строк. В обоих случаях
новая программа стартует с заданными аргументами, представленными в массиве
argv
, передаваемом функции
main
.

Эти функции реализованы, как правило, с использованием

execve
, хотя нет обязательных требований на этот счет.

Функции, имена которых содержат суффикс

p
, отличаются тем, что ищут переменную окружения
PATH
для определения исполняемого файла новой программы. Если эта переменная не позволяет найти нужный файл, необходимо передать функции как параметр абсолютное имя файла, включающее каталоги.

Передать значение окружению программы может глобальная переменная

environ
. Другой вариант — дополнительный аргумент в функциях
execle
и
execve
, способный передавать строки, используемые как окружение новой программы.

Если вы хотите применить функцию

exec
для запуска программы
ps
, можно выбирать любую функцию из семейства
exec
, как показано в вызовах приведенного далее фрагмента программного кода:

#include <unistd.h>

/* Пример списка аргументов */

/* Учтите, что для argv[0] необходимо имя программы */

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

/* He слишком полезный пример окружения */

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

/* Возможные вызовы функций exec */

execl("/bin/ps", "ps", "ax", 0);

/* предполагается, что ps в /bin */

execlp("ps", "ps", "ax", 0);

/* предполагается, что /bin в PATH */

execle("/bin/ps", "ps", "ax", 0, ps_envp);

/* передается свое окружение */

execv("/bin/ps", ps_argv);

execvp("ps", ps_argv);

execve("/bin/ps", ps_argv, ps_envp);

А теперь выполните упражнение 11.2.

Упражнение 11.2. Функция
execlp

Давайте изменим пример и используем вызов

execlp
:

#include <unistd.h>

#include <stdio.h>

#include <stdlib.h>

int main {

 printf("Running ps with execlp\n");

 execlp("ps", "ps", "ax", 0);

 printf("Done.\n");

 exit(0);

}

Когда

вы выполните эту программу, рехес.с, то получите обычный вывод команды
ps
, но без сообщения
Done
. Кроме того, обратите внимание на то, что в выводе нет процесса с именем
рехес
:

$ ./рехес

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
. Далее она выполняет команду вместо программы
рехес
, запустив ее так, как будто вы ввели команду командной оболочки

$ ps ax

Когда

ps
завершается, вы получаете новую строку приглашения командной оболочки. Возврата в программу
рехес
не происходит, поэтому второе сообщение не выводится. PID нового процесса тот же, что и у исходного, то же самое можно сказать о PID родительского процесса и значении
nice
. В сущности, происходит следующее: выполняющаяся программа запустила на выполнение новый код и новый исполняемый файл, заданный в вызове функции
exec
.

Существует ограничение для общего размера списка аргументов и окружения процесса, запускаемого функциями

exec
. Оно задается в переменной
ARG_MAX
и в системах Linux равно 128 Кбайт. В других системах может задаваться меньший предельный размер, что способно порождать проблемы. Стандарт POSIX гласит, что
ARG_MAX
должна быть не менее 4096 байтов.

Функции

exec
, как правило, не возвращаются в программу до тех пор, пока не возникла ошибка, в этом случае задается переменная
errno
и функция
exec
возвращает -1.

Новые процессы, запущенные exec, наследуют многие свойства исходного процесса. В частности, открытые файловые дескрипторы остаются открытыми в новом процессе, пока не установлен их флаг

FD_CLOEXEC
(close on exec) (подробную информацию см. в описании системного вызова
fcntl
в главе 3). Любые открытые в исходном процессе потоки каталогов закрываются.

Дублирование образа процесса

Для применения процессов, выполняющих несколько функций одновременно, можно либо использовать потоки, обсуждаемые в главе 12, либо создавать в программе полностью отдельный процесс, как делает

init
, вместо замещения текущего потока исполнения, как в случае применения функции
exec
.

Поделиться:
Популярные книги

Семейная энциклопедия здоровья

авторов Коллектив
Справочная литература:
энциклопедии
прочая справочная литература
5.00
рейтинг книги
Семейная энциклопедия здоровья

Дважды одаренный. Том V

Тарс Элиан
5. Дважды одаренный
Фантастика:
аниме
альтернативная история
городское фэнтези
5.25
рейтинг книги
Дважды одаренный. Том V

Кровь, слезы и лавры

Пикуль Валентин Саввич
Исторические миниатюры
Проза:
историческая проза
5.00
рейтинг книги
Кровь, слезы и лавры

Я царь. Книга XXVIII

Дрейк Сириус
28. Дорогой барон!
Фантастика:
боевая фантастика
аниме
попаданцы
5.60
рейтинг книги
Я царь. Книга XXVIII

Козацькому роду нема переводу, або ж Мамай i Чужа Молодиця

Ильченко Александр Елисеевич
Проза:
роман
5.00
рейтинг книги
Козацькому роду нема переводу, або ж Мамай i Чужа Молодиця

Избранные сочинения в 9 томах. Том 1 Зверобой; Последний из могикан

Купер Джеймс Фенимор
1. Ф.Купер Избранные сочинения в 9 томах
Приключения:
приключения про индейцев
6.80
рейтинг книги
Избранные сочинения в 9 томах. Том 1 Зверобой; Последний из могикан

Росская империя (сборник)

Эльтеррус Иар
Росская Империя
Фантастика:
боевая фантастика
8.24
рейтинг книги
Росская империя (сборник)

Созвездие эректуса

Розов Александр Александрович
5. Конфедерация Меганезия
Фантастика:
фэнтези
5.00
рейтинг книги
Созвездие эректуса

Возвращение домой.Том 1

Пилчер Розамунда
Проза:
современная проза
8.00
рейтинг книги
Возвращение домой.Том 1

Путешественник

Юань Е
3. Повелитель тайн
Фантастика:
фэнтези
эпическая фантастика
5.00
рейтинг книги
Путешественник

Воронцов. Перезагрузка

Тарасов Ник
1. Воронцов. Перезагрузка
Фантастика:
попаданцы
альтернативная история
фантастика: прочее
5.50
рейтинг книги
Воронцов. Перезагрузка

Вечно голодный студент 8

RedDetonator
8. Вечно голодный студент
Фантастика:
боевая фантастика
постапокалипсис
рпг
фэнтези
фантастика: прочее
5.00
рейтинг книги
Вечно голодный студент 8

Егерь. Системный зверолов

Скиба Николай
1. Зверолов
Фантастика:
рпг
уся
фэнтези
фантастика: прочее
попаданцы
6.50
рейтинг книги
Егерь. Системный зверолов

Все будет по-моему! Часть 12

Wing-Span
12. Всё будет по-моему!
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Все будет по-моему! Часть 12