Для изменения пользовательского контекста процесса применяется системный вызов exec() , который пользователь не может вызвать непосредственно. Вызов exec() заменяет пользовательский контекст текущего процесса на содержимое некоторого исполняемого файла и устанавливает начальные значения регистров процессора (в том числе устанавливает программный счетчик на начало загружаемой программы). Этот вызов требует для своей работы задания имени исполняемого файла, аргументов командной строки и параметров окружающей среды. Для осуществления вызова программист может воспользоваться одной из шести функций: execlp() , execvp() , execl() и, execv() , execle() , execve() , отличающихся друг от друга представлением параметров, необходимых для работы системного вызова exec() . Взаимосвязь указанных выше функций изображена на рисунке 3–4.3.
Рис. 3-4.3. Взаимосвязь различных функций для выполнения системного вызова exec()
Функции изменения пользовательского контекста процесса
Прототипы функций
5 этапов запуска речи. Как облегчить процесс развития речи ребенка.
#include int execlp(const char *file, const char *arg0, . const char *argN,(char *)NULL) int execvp(const char *file, char *argv[]) int execl(const char *path, const char *arg0, . const char *argN,(char *)NULL) int execv(const char *path, char *argv[]) int execle(const char *path, const char *arg0, . const char *argN,(char *)NULL, char * envp[]) int execve(const char *path, char *argv[], char *envp[])
Описание функций
Для загрузки новой программы в системный контекст текущего процесса используется семейство взаимосвязанных функций, отличающихся друг от друга формой представления параметров.
Аргумент file является указателем на имя файла, который должен быть загружен. Аргумент path – это указатель на полный путь к файлу, который должен быть загружен.
Аргументы arg0, . argN представляют собой указатели на аргументы командной строки. Заметим, что аргумент arg0 должен указывать на имя загружаемого файла. Аргумент argv представляет собой массив из указателей на аргументы командной строки. Начальный элемент массива должен указывать на имя загружаемой программы, а заканчиваться массив должен элементом, содержащим указатель NULL .
Аргумент envp является массивом указателей на параметры окружающей среды, заданные в виде строк «переменная=строка» . Последний элемент этого массива должен содержать указатель NULL .
Поскольку вызов функции не изменяет системный контекст текущего процесса, загруженная программа унаследует от загрузившего ее процесса следующие атрибуты:
- идентификатор процесса;
- идентификатор родительского процесса ;
- групповой идентификатор процесса;
- идентификатор сеанса;
- время, оставшееся до возникновения сигнала SIGALRM ;
- текущую рабочую директорию;
- маску создания файлов;
- идентификатор пользователя;
- групповой идентификатор пользователя;
- явное игнорирование сигналов;
- таблицу открытых файлов (если для файлового дескриптора не устанавливался признак «закрыть файл при выполнении exec() «).
В случае успешного выполнения возврата из функций в программу, осуществившую вызов, не происходит, а управление передается загруженной программе. В случае неудачного выполнения в программу, инициировавшую вызов, возвращается отрицательное значение.
Как использовать журнал событий в Windows
Поскольку системный контекст процесса при вызове exec() остается практически неизменным, большинство атрибутов процесса , доступных пользователю через системные вызовы ( PID , UID , GID , PPID и другие, смысл которых станет понятен по мере углубления наших знаний на дальнейших занятиях), после запуска новой программы также не изменяется.
Важно понимать разницу между системными вызовами fork() и exec() . Системный вызов fork() создает новый процесс, у которого пользовательский контекст совпадает с пользовательским контекстом процесса-родителя. Системный вызов exec() изменяет пользовательский контекст текущего процесса, не создавая новый процесс.
Прогон программы с использованием системного вызова exec()
Для иллюстрации использования системного вызова exec() давайте рассмотрим следующую программу
/* Программа 03-2.с, изменяющая пользователь- ский контекст процесса (запускающая другую программу) */ #include #include #include int main(int argc, char *argv[], char *envp[])< /* Мы будем запускать команду cat c аргументом командной строки 03-2.с без изменения параметров среды, т.е. фактически выполнять команду «cat 03-2.c», которая должна выдать содержимое данного файла на экран. Для функции execle в качестве имени программы мы указываем ее полное имя с путем от корневой директории —/bin/cat.
Первое слово в командной строке у нас должно совпадать с именем запускаемой программы. Второе слово в командной строке – это имя файла, содержимое которого мы хотим распечатать. */ (void) execle(«/bin/cat», «/bin/cat», «03-2.c», 0, envp); /* Сюда попадаем только при возникновении ошибки */ printf(«Error on program startn»); exit(-1); return 0; /* Никогда не выполняется, нужен для того, чтобы компилятор не выдавал warning */ >
Листинг 3.2. Программа 03-2.с, изменяющая пользовательский контекст процесса
Откомпилируйте ее и запустите на исполнение . Поскольку при нормальной работе будет распечатываться содержимое файла с именем 03-2.c , такой файл при запуске должен присутствовать в текущей директории (проще всего записать исходный текст программы под этим именем). Проанализируйте результат.
Написание, компиляция и запуск программы для изменения пользовательского контекста в порожденном процессе
Для закрепления полученных знаний модифицируйте программу, созданную при выполнении задания раздела «Написание, компиляция и запуск программы с использованием вызова fork() с разным поведением процессов ребенка и родителя» так, чтобы порожденный процесс запускал на исполнение новую (любую) программу.
Источник: intuit.ru
Функция CreateProcessA (processthreadsapi.h)
Создает новый процесс и его основной поток. Новый процесс выполняется в контексте безопасности вызывающего процесса.
Если вызывающий процесс олицетворяет другого пользователя, новый процесс использует маркер для вызывающего процесса, а не токен олицетворения. Чтобы запустить новый процесс в контексте безопасности пользователя, представленного маркером олицетворения, используйте функцию CreateProcessAsUser или CreateProcessWithLogonW .
Синтаксис
BOOL CreateProcessA( [in, optional] LPCSTR lpApplicationName, [in, out, optional] LPSTR lpCommandLine, [in, optional] LPSECURITY_ATTRIBUTES lpProcessAttributes, [in, optional] LPSECURITY_ATTRIBUTES lpThreadAttributes, [in] BOOL bInheritHandles, [in] DWORD dwCreationFlags, [in, optional] LPVOID lpEnvironment, [in, optional] LPCSTR lpCurrentDirectory, [in] LPSTARTUPINFOA lpStartupInfo, [out] LPPROCESS_INFORMATION lpProcessInformation );
Параметры
[in, optional] lpApplicationName
Имя выполняемого модуля. Этот модуль может быть приложением на основе Windows. Это может быть другой тип модуля (например, MS-DOS или OS/2), если соответствующая подсистема доступна на локальном компьютере.
В строке можно указать полный путь и имя файла модуля для выполнения или указать частичное имя. В случае частичного имени функция использует текущий диск и текущий каталог для завершения спецификации. Функция не будет использовать путь поиска. Этот параметр должен включать расширение имени файла; расширение по умолчанию не предполагается.
Параметр lpApplicationName может иметь значение NULL. В этом случае имя модуля должно быть первым маркером с разделителями пробелами в строке lpCommandLine . Если вы используете длинное имя файла, содержащее пробел, используйте строки в кавычках, чтобы указать, где заканчивается имя файла и начинаются аргументы; В противном случае имя файла будет неоднозначным. Например, рассмотрим строку «c:program filessub dirprogram name». Эту строку можно интерпретировать несколькими способами. Система пытается интерпретировать возможности в следующем порядке:
- c:program.exe
- c:program filessub.exe
- c:program filessub dirprogram.exe
- c:program filessub dirprogram name.exe
Если исполняемый модуль является 16-разрядным приложением, lpApplicationName должно иметь значение NULL, а строка, на которую указывает lpCommandLine , должна указывать исполняемый модуль, а также его аргументы.
Чтобы запустить пакетный файл, необходимо запустить интерпретатор команд; Задайте для параметра lpApplicationName значение cmd.exe и задайте для lpCommandLine следующие аргументы: /c плюс имя пакетного файла.
[in, out, optional] lpCommandLine
Командная строка, выполняемая.
Максимальная длина этой строки составляет 32 767 символов, включая завершающий символ NULL в Юникоде. Если lpApplicationName имеет значение NULL, часть имени модуля lpCommandLine ограничена MAX_PATH символами.
Версия этой функции в Юникоде CreateProcessW может изменять содержимое этой строки. Поэтому этот параметр не может быть указателем на память, доступную только для чтения (например, переменную const или строку литерала). Если этот параметр является строкой константы, функция может привести к нарушению доступа.
Параметр lpCommandLine может иметь значение NULL. В этом случае функция использует строку, на которую указывает lpApplicationName , в качестве командной строки.
Если и lpApplicationName , и lpCommandLine имеют значение, отличное от NULL, строка, завершающаяся значением NULL, на которую указывает lpApplicationName , указывает модуль для выполнения, а строка, завершающаяся значением NULL, на которую указывает lpCommandLine , указывает командную строку. Новый процесс может использовать GetCommandLine для получения всей командной строки. Консольные процессы, написанные на языке C, могут использовать аргументы argc и argv для анализа командной строки. Так как argv[0] — это имя модуля, программисты C обычно повторяют имя модуля в качестве первого маркера в командной строке.
Если lpApplicationName имеет значение NULL, первый маркер командной строки с разделителями пробелами указывает имя модуля. Если вы используете длинное имя файла, содержащее пробел, используйте строки в кавычках, чтобы указать, где заканчивается имя файла и начинаются аргументы (см. описание параметра lpApplicationName ). Если имя файла не содержит расширения, добавляется .exe. Поэтому, если расширение имени файла — .com, этот параметр должен включать расширение .com. Если имя файла заканчивается точкой (.) без расширения или если имя файла содержит путь, .exe не добавляется. Если имя файла не содержит пути к каталогу, система выполняет поиск исполняемого файла в следующей последовательности:
- Каталог, из которого загружено приложение.
- Текущий каталог для родительского процесса.
- 32-разрядный системный каталог Windows. Используйте функцию GetSystemDirectory , чтобы получить путь к этому каталогу.
- 16-разрядный системный каталог Windows. Нет функции, которая получает путь к этому каталогу, но выполняется поиск. Имя этого каталога — System.
- Каталог Windows. Используйте функцию GetWindowsDirectory , чтобы получить путь к этому каталогу.
- Каталоги, перечисленные в переменной среды PATH. Обратите внимание, что эта функция не выполняет поиск по пути для каждого приложения, указанному в разделе реестра Пути приложений . Чтобы включить этот путь для каждого приложения в последовательность поиска, используйте функцию ShellExecute .
[in, optional] lpProcessAttributes
Указатель на структуру SECURITY_ATTRIBUTES , которая определяет, может ли возвращенный дескриптор нового объекта процесса наследоваться дочерними процессами. Если lpProcessAttributes имеет значение NULL, дескриптор не может быть унаследован.
Элемент lpSecurityDescriptor структуры задает дескриптор безопасности для нового процесса. Если lpProcessAttributes имеет значение NULL или lpSecurityDescriptor имеет значение NULL, процесс получает дескриптор безопасности по умолчанию. Списки управления доступом в дескрипторе безопасности по умолчанию для процесса поступают из основного маркера создателя. Windows XP: Списки управления доступом в дескрипторе безопасности по умолчанию для процесса поступают из основного маркера или маркера олицетворения создателя. Это поведение изменилось в Windows XP с пакетом обновления 2 (SP2) и Windows Server 2003.
[in, optional] lpThreadAttributes
Указатель на структуру SECURITY_ATTRIBUTES , которая определяет, может ли возвращенный дескриптор нового объекта потока наследоваться дочерними процессами. Если lpThreadAttributes имеет значение NULL, дескриптор не может быть унаследован.
Элемент lpSecurityDescriptor структуры задает дескриптор безопасности для основного потока. Если lpThreadAttributes имеет значение NULL или lpSecurityDescriptor имеет значение NULL, поток получает дескриптор безопасности по умолчанию. Списки управления доступом в дескрипторе безопасности по умолчанию для потока поступают из маркера процесса. Windows XP: Списки управления доступом в дескрипторе безопасности по умолчанию для потока поступают из основного маркера или маркера олицетворения создателя. Это поведение изменилось в Windows XP с пакетом обновления 2 (SP2) и Windows Server 2003.
Если этот параметр имеет значение TRUE, каждый наследуемый дескриптор в вызывающем процессе наследуется новым процессом. Если параметр имеет значение FALSE, дескрипторы не наследуются. Обратите внимание, что унаследованные дескрипторы имеют те же значения и права доступа, что и исходные дескрипторы. Дополнительные сведения о наследуемых дескрипторах см. в разделе Примечания.
Службы терминалов: Нельзя наследовать дескрипторы между сеансами. Кроме того, если этот параметр имеет значение TRUE, процесс необходимо создать в том же сеансе, что и вызывающий объект.
Процессы Защищенного процесса Light (PPL): Наследование универсального дескриптора блокируется, когда процесс PPL создает процесс, отличный от PPL, так как PROCESS_DUP_HANDLE не допускается из процесса, отличного от PPL, к процессу PPL. См. раздел Управление правами на доступ и безопасность процесса.
Флаги, управляющие классом приоритета и созданием процесса. Список значений см. в разделе Флаги создания процесса.
Этот параметр также управляет классом приоритета нового процесса, который используется для определения приоритетов планирования потоков процесса. Список значений см. в разделе GetPriorityClass. Если ни один из флагов класса приоритета не указан, класс приоритета по умолчанию NORMAL_PRIORITY_CLASS , если только класс приоритета процесса создания не IDLE_PRIORITY_CLASS или BELOW_NORMAL_PRIORITY_CLASS. В этом случае дочерний процесс получает класс приоритета по умолчанию вызывающего процесса.
Если параметр dwCreationFlags имеет значение 0:
- Процесс наследует режим ошибок вызывающего объекта и родительской консоли.
- Предполагается, что блок среды для нового процесса содержит символы ANSI (дополнительные сведения см. в разделе параметр lpEnvironment ).
- 16-разрядное приложение windows выполняется на общей виртуальной машине DOS (VDM).
[in, optional] lpEnvironment
Указатель на блок среды для нового процесса. Если этот параметр имеет значение NULL, новый процесс использует среду вызывающего процесса.
Блок среды состоит из блока строк, завершаемых значением NULL. Каждая строка имеет следующий вид:
Имя=value
Так как знак равенства используется в качестве разделителя, его нельзя использовать в имени переменной среды.
Блок среды может содержать символы Юникода или ANSI. Если блок среды, на который указывает lpEnvironment , содержит символы Юникода, убедитесь, что dwCreationFlags содержит CREATE_UNICODE_ENVIRONMENT.
Версия ANSI этой функции CreateProcessA завершается сбоем, если общий размер блока среды для процесса превышает 32 767 символов.
Обратите внимание, что блок среды ANSI завершается двумя нулевыми байтами: один для последней строки, еще один для завершения блока. Блок среды Юникода завершается четырьмя нулевыми байтами: два для последней строки, еще два для завершения блока.
[in, optional] lpCurrentDirectory
Полный путь к текущему каталогу для процесса. В строке также можно указать UNC-путь.
Если этот параметр имеет значение NULL, новый процесс будет иметь тот же текущий диск и каталог, что и вызывающий процесс. (Эта функция предоставляется в основном для оболочек, которым необходимо запустить приложение и указать его начальный диск и рабочий каталог.)
Чтобы задать расширенные атрибуты, используйте структуру STARTUPINFOEX и укажите EXTENDED_STARTUPINFO_PRESENT в параметре dwCreationFlags .
Дескрипторы в STARTUPINFO или STARTUPINFOEX должны быть закрыты с помощью CloseHandle , если они больше не нужны.
Важно Вызывающий объект отвечает за то, чтобы стандартные поля дескрипторов в STARTUPINFO содержали допустимые значения дескрипторов. Эти поля копируются без изменений в дочерний процесс без проверки, даже если член dwFlags указывает STARTF_USESTDHANDLES. Неправильные значения могут привести к неправильному поведению дочернего процесса или аварийному завершению. Используйте средство проверки среды выполнения Проверки приложений для обнаружения недопустимых дескрипторов.
Указатель на структуру PROCESS_INFORMATION , получающую идентификационные сведения о новом процессе.
Маркеры в PROCESS_INFORMATION должны быть закрыты с помощью CloseHandle , если они больше не нужны.
Возвращаемое значение
Если функция выполняется успешно, возвращается ненулевое значение.
Если функция выполняется неудачно, возвращается нулевое значение. Дополнительные сведения об ошибке можно получить, вызвав GetLastError.
Обратите внимание, что функция возвращается до завершения инициализации процесса. Если не удается найти необходимую библиотеку DLL или не удается инициализировать, процесс завершается. Чтобы получить состояние завершения процесса, вызовите Метод GetExitCodeProcess.
Комментарии
Процессу назначается идентификатор процесса. Идентификатор действителен до завершения процесса. Его можно использовать для идентификации процесса или указать в функции OpenProcess , чтобы открыть дескриптор процесса. Начальному потоку в процессе также назначается идентификатор потока. Его можно указать в функции OpenThread , чтобы открыть дескриптор потока.
Идентификатор действителен до завершения потока и может использоваться для уникальной идентификации потока в системе. Эти идентификаторы возвращаются в структуре PROCESS_INFORMATION .
Имя исполняемого файла в командной строке, которое операционная система предоставляет процессу, не обязательно совпадает с именем в командной строке, которую вызывающий процесс присваивает функции CreateProcess . Операционная система может добавить полный путь к имени исполняемого файла, которое предоставляется без полного пути.
Вызывающий поток может использовать функцию WaitForInputIdle , чтобы дождаться завершения инициализации нового процесса и ожидать ввода данных пользователем без ожидания ввода. Это может быть полезно для синхронизации между родительским и дочерним процессами, так как CreateProcess возвращает, не дожидаясь завершения инициализации нового процесса. Например, процесс создания будет использовать WaitForInputIdle перед попыткой найти окно, связанное с новым процессом.
Предпочтительным способом завершения процесса является использование функции ExitProcess , так как эта функция отправляет уведомление о приближении завершения во все библиотеки DLL, присоединенные к процессу. Другие средства завершения процесса не уведомляют подключенные библиотеки DLL. Обратите внимание, что, когда поток вызывает ExitProcess, другие потоки процесса завершаются без возможности выполнить какой-либо дополнительный код (включая код завершения потока присоединенных библиотек DLL). Дополнительные сведения см. в разделе Завершение процесса.
Родительский процесс может напрямую изменять переменные среды дочернего процесса во время создания процесса. Это единственная ситуация, когда процесс может напрямую изменить параметры среды другого процесса. Дополнительные сведения см. в разделе Изменение переменных среды.
Если приложение предоставляет блок среды, сведения о текущем каталоге системных дисков не распространяются автоматически в новый процесс. Например, существует переменная среды с именем =C: значением является текущий каталог на диске C. Приложение должно вручную передать сведения о текущем каталоге в новый процесс. Для этого приложение должно явно создать эти строки переменных среды, отсортировать их по алфавиту (так как система использует отсортированную среду) и поместить их в блок среды. Как правило, они выполняются в передней части блока среды из-за порядка сортировки блоков среды.
Один из способов получить сведения о текущем каталоге для диска X — выполнить следующий вызов: GetFullPathName(«X:», . ) . Это позволяет избежать необходимости сканирования блока среды для приложения. Если возвращается полный путь X:, нет необходимости передавать это значение в качестве данных среды, так как корневой каталог является текущим каталогом по умолчанию для диска X нового процесса.
При создании процесса с указанным CREATE_NEW_PROCESS_GROUP выполняется неявный вызов SetConsoleCtrlHandler(NULL,TRUE) от имени нового процесса; это означает, что для нового процесса отключено сочетание клавиш CTRL+C. Это позволяет оболочкам самостоятельно обрабатывать клавиши CTRL+C и выборочно передавать этот сигнал в вложенные процессы. СОЧЕТАНИЕ КЛАВИШ CTRL+BREAK не отключено и может использоваться для прерывания процесса или группы процессов.
По умолчанию передача TRUE в качестве значения параметра bInheritHandles приводит к тому, что новый процесс наследует все наследуемые дескрипторы. Это может быть проблемой для приложений, которые создают процессы из нескольких потоков одновременно, но хотят, чтобы каждый процесс наследовал разные дескрипторы. Приложения могут использовать функцию UpdateProcThreadAttributeList с параметром PROC_THREAD_ATTRIBUTE_HANDLE_LIST для предоставления списка дескрипторов, наследуемых определенным процессом.
Замечания по безопасности
Первый параметр lpApplicationName может иметь значение NULL. В этом случае имя исполняемого файла должно находиться в строке с разделителями пробелами, на которую указывает lpCommandLine. Если в имени исполняемого файла или пути есть пробел, существует риск запуска другого исполняемого файла из-за того, как функция анализирует пробелы. Следующий пример опасен тем, что функция будет пытаться выполнить «Program.exe», если она существует, а не «MyApp.exe».
LPTSTR szCmdline = _tcsdup(TEXT(«C:\Program Files\MyApp -L -S»)); CreateProcess(NULL, szCmdline, /* . */);
Если злоумышленник создает приложение с именем «Program.exe» в системе, любая программа, которая неправильно вызывает CreateProcess с помощью каталога Program Files, будет запускать это приложение вместо предполагаемого приложения.
Чтобы избежать этой проблемы, не передайте значение NULL для lpApplicationName. Если вы передаете значение NULL для lpApplicationName, используйте кавычки вокруг пути к исполняемому файлу в lpCommandLine, как показано в примере ниже.
LPTSTR szCmdline[] = _tcsdup(TEXT(«»C:\Program Files\MyApp» -L -S»)); CreateProcess(NULL, szCmdline, /*. */);
Примеры
Требования
Минимальная версия клиента | Windows XP [| классических приложений Приложения UWP] |
Минимальная версия сервера | Windows Server 2003 [классические приложения | Приложения UWP] |
Целевая платформа | Windows |
Header | processthreadsapi.h (включая Windows.h в Windows Server 2003, Windows Vista, Windows 7, Windows Server 2008 Windows Server 2008 R2) |
Библиотека | Kernel32.lib |
DLL | Kernel32.dll |
Источник: learn.microsoft.com
7.3. Программный запуск процессов
Любая нить текущего процесса может выполнить запуск нового процесса. В QNX имеются различные способы программного запуска процессов. Для этих способов существуют соответствующие им функции запуска процесса. Они следующие:
- функция system();
- семейство функций exec*();
- семейство функций spawn*();
- функция fork();
- функция vfork().
7.3.1. Функция system()
#include int system(const char *command); Поведение функции зависит от значения аргумента command. Если command равен NULL, то определяется, имеется ли в системе shell и функция возвращает ноль, если shell отсутствует, или отличное от нуля значение, если присутствует.
Если command не равен NULL, то запускается копия shell и ему, через указатель command, передается командная строка для обработки и возвращается результат выполнения shell и статус завершения его выполнения, соответствующей выполненной команде. Если shell не смог загрузиться, то возвращается -1.
Пример: #include #include #include int main( void ) < int rc; rc = system(«ls»); if( rc == -1 ) < printf( «shell не может запуститься n» ); >else < printf( «Результат выполнения команды %dn», WEXITSTATUS( rc ) ); >return EXIT_SUCCESS; > Примечание. Макрокоманда int WIFEXITED (int status), определеноя в заглавном файле » sys/wait.h » возвращает значение отличное от нуля, если дочерний процесс завершон exit или _exit. Функция void _exit (int status) для завершения процесса с состоянием status. Макрокоманды EXIT_SUCCESS и EXIT_FAILURE, объявленые в файле «stdlib.h» можно использовать для стандартного значения состояния успеха и отказа, соответственно.
7.3.2. Функции семейства exec*()
Существует набор функций семейства exec*(), которые реализуют однотипный способ запуска процессов и отличаются только некоторыми деталями. Особенность запуска процесса этими функциями заключается в следующем.
Процесс, вызвавший функцию семейства exec*(), прекращает выполнять текущий программный код и начинает выполнение инструкций нового (указанного в вызове функции) программного модуля. Важно то, что идентификатор процесса — pid, при этом остается прежним. К функциям семейства exec*() относятся функции execl(), execle(), execlp(), execlpe(), execv(), execve(), execvp(), execvpe().
В качестве примера рассмотрим функции execl(), execle() и execv() семейства exec*(). Объявление функции execl() имеет вид: #include int execl( const char * path, const char * arg0, const char * arg1. const char * argn, NULL ); Возвращает -1 в случае ошибки, иначе возвращаемый результат не определен. Пример. #include #include … execl( «myprog», «myprog», «ARG1», «ARG2», NULL ); … Объявление функции execle() имеет вид: #include int execle( const char * path, const char * arg0, const char * arg1. const char * argn, NULL, const char * envp[] ); Пример. #include #include char* env_list[] = < «SOURCE=MYDATA», «TARGET=OUTPUT», «lines=65», NULL >; execle(«myprog»,»myprog»,»ARG1″, «ARG2», NULL,env_list); Окружение для вызываемой программы состоит изх трех переменных окружения: SOURCE, TARGET и lines. Объявление функции execv() имеет вид: #include int execv( const char *path,char *const argv[] ); Возвращает -1 в случае ошибки, иначе возвращаемый результат не определен. Пример. #include #include char* arg_list[] = < «myprog», «ARG1», «ARG2», NULL >; execv( «myprog», arg_list ); В рассмотренных примерах предполагается, что программный модуль myprog находится в текущем каталоге.
Источник: studfile.net