Читаем Linux программирование в примерах полностью

Пять дополнительных функций, действующих в качестве оболочек, предоставляют более удобные интерфейсы для 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

4  #include

5  #include

6

7  /* main --- настроить argv и запустить указанную программу */

8

9  int main(int argc, char **argv)

10 {

11  char *path;

12

13  if (argc < 3) {

14   fprintf(stderr, "usage: %s path arg0 [ arg ... ]\n", argv[0]);

15   exit(1);

16  }

17

18  path = argv[1];

19

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

Похожие книги

C++ Primer Plus
C++ Primer Plus

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

Программирование, программы, базы данных