_spawn, функции _wspawn
Каждое _spawn функции создают и выполняют новый процесс:
Буквы в конце имени функции, определяющих изменения.
e
envpмассив указателей на параметры среды, передается новому процессу.l
Аргументы командной строки, передаваемые по отдельности к _spawn функция.Данный суффикс обычно используется, когда несколько параметров в новый процесс известны заранее.p
PATH переменная среды используется, чтобы найти файл для выполнения.v
argvмассив указателей на аргументы командной строки, передается _spawn функция.Данный суффикс обычно используется, когда несколько параметров в новый процесс переменны.
Заметки
_spawn функции каждое создает и выполняет новый процесс.Они автоматически изменяются аргументы характерной черты, узнающ последовательности многобайтового символов в соответствии с многобайтовой кодовой странице в настоящий момент используется._wspawn функции версии расширенных символов _spawn функции; они не обрабатывают характерные черты.в противном случае, _wspawn поведение идентично их функции _spawn аналогом.
Сопоставления подпрограммы Родов-Текста
Подпрограмма Tchar.h |
Не указанные _UNICODE и _MBCS |
Указанный символ _MBCS |
Указанный _UNICODE |
---|---|---|---|
_tspawnl |
_spawnl |
_spawnl |
_wspawnl |
_tspawnle |
_spawnle |
_spawnle |
_wspawnle |
_tspawnlp |
_spawnlp |
_spawnlp |
_wspawnlp |
_tspawnlpe |
_spawnlpe |
_spawnlpe |
_wspawnlpe |
_tspawnv |
_spawnv |
_spawnv |
_wspawnv |
_tspawnve |
_spawnve |
_spawnve |
_wspawnve |
_tspawnvp |
_spawnvp |
_spawnvp |
_wspawnvp |
_tspawnvpe |
_spawnvpe |
_spawnvpe |
_wspawnvpe |
Достаточно памяти, должна быть доступна для загрузки и выполнения новый процесс.mode аргумент указывает действие, выполняемое при вызове процессом и в течение _spawn.Следующие значения mode укажите в Process.h:
_P_OVERLAY
Overlays вызывающий процесс с новый процесс уничтожение вызывающий процесс (тот же эффект, что и _exec вызовы)._P_WAIT
Приостанавливает вызывающий поток до тех пор, пока выполнение не будет завершено (нового процесса в синхронном режиме _spawn)._P_NOWAIT или _P_NOWAITO
Продолжает исполнять вызывающий процесс в синхронном режиме с новым (асинхронным процессом _spawn)._P_DETACH
Вызывающий процесс продолжается выполнение; новый процесс выполняется в фоновом режиме, без доступа на консоль или клавиатуры.Вызовы _cwait для нового (асинхронного процесса завершается с ошибкой _spawn).
cmdname аргумент указывает файл, в который выполняется как новый процесс и может указать полный путь (от корневого), частично путь (от текущей рабочей папки) или просто имя файла.If cmdname не имеет расширение имени файла не будет завершен или с точкой (.), _spawn первые действуют пытаются расширение имени файла .com, а затем расширение имени файла exe, расширение имени файла bat, cmd и наконец расширение имени файла.
If cmdname имеет расширение имени файла, то используется только расширение.If cmdname с точкой _spawn поиск вызова для cmdname без расширения имени файла._spawnlp" _spawnlpe" _spawnvpи_spawnvpe поиск функций cmdname (используя те же процедуры) в каталогах, указанных PATH переменная среды.
If cmdname содержит описатель диска или все знаки косой черты (т е если это относительный путь) _spawn вызов выполняет поиск только для указанного файла; ни поиск пути не производится.
В прошлом некоторые из этих функций задают errno значение нуль в случае успеха; текущая функциональности оставлять errno нетронуто в случае успешного выполнения в соответствии с стандартом c.Если нужно смоделировать старая функциональности, параметр errno равным нулю только до вызова этих функций.
Примечание |
---|
Чтобы обеспечить правильное завершение инициализации и перекрытия не используйте setjmp OR longjmp функция для ввода или оставить программу перекрытия. |
Аргументы для икренного процесса
Для передачи аргументов в новый процесс, присвойте один или несколько указателей в строках символов, таких как аргументы _spawn вызов.Эти символьные строки формируют список аргументов для икренного процесса.Совмещенная длина строк, формируя список аргументов для нового процесса не должен превышать 1024 байт.Конечный нуль-символ (" \ 0 ") для каждой строки не включен в количестве, но пробелы (автоматически, вставленные в отдельный аргументам) включаются.
Примечание |
---|
Внедренные пробелы в строках могут вызвать непредвиденную расширения функциональности; например, передавая _spawn string "hi there" завершится в новом процессе получения аргумента, 2 "hi" и "there".Если назначение была быть открыт нового процесса файл с именем "высокие" есть, то процесс завершился бы ошибкой.Можно избежать этого, заключать в кавычки строки: "\"hi there\"". |
Примечание по безопасности |
---|
Не следует передавать входные данные пользователя _spawn без явно проверить его содержимое._spawn приведет к вызову CreateProcess поэтому имейте в виду, что неполные имена путей может привести к потенциальным уязвимостям. |
Можно передавать указатели аргументов аргументы (в виде отдельного _spawnl" _spawnle" _spawnlpи _spawnlpe) или как массив указателей (в _spawnv" _spawnve" _spawnvpи _spawnvpe).Необходимо указывать по меньшей мере один аргумент arg0 OR argv[0], на икренному процессу.По соглашению этот аргумент имя программы по мере ее ввести в командной строке.Другое значение не вызовет ошибку.
_spawnl" _spawnle" _spawnlpи _spawnlpe вызовы обычно используются в тех случаях, когда число аргументов известно заранее.arg0 обычно указатель на аргумент cmdname.Аргументы arg1 via argn указатели на строки символов, формируя новый список аргументов.Уточняющий запрос argnдолжно быть a NULL указатель, чтобы отметить конец списка аргументов.
_spawnv" _spawnve" _spawnvpи _spawnvpe вызовы могут быть полезны при переменное число аргументов к новому процессу.Указатели к аргументам передаются в виде массива argv*.* Аргумент argv[0] обычно указатель на пути в реальном режиме или на имя программы в защищенном режиме. argv[1] до конца argv[n] указатели на строки символов формируя новый список аргументов.Аргумент argv[n +1] должны быть a NULL указатель, чтобы отметить конец списка аргументов.
Среда икренного процесса
Файлы, открытые при a _spawn вызывается остается открытым в новом процессе.в _spawnl" _spawnlp" _spawnvи _spawnvp вызовы новый процесс наследуют среду вызывающего процесса.Можно использовать _spawnle" _spawnlpe" _spawnveи _spawnvpe вызовы для изменения среды для нового процесса путем передачи списка параметров среды через envp аргумент.Аргумент envp массив указателей, каждый элемент (за исключением последнего элемента), что указывает на null-завершенной строке, указав переменную среды.Такая строка обычно имеет форму NAME=value где NAME имя переменной среды и value строковое значение, в котором эта переменная задана.(Обратите внимание, что value не заключен в двойные кавычки ("). Конечный элемент envp массив должен иметь NULL.После envp сам NULLпроцесс, икренный наследует параметры среды родительского процесса.
_spawn функции могут передавать все сведения об открытых файлах, в том числе режим преобразования в новый процесс.Эти сведения передаются в реальный режим посредством C_FILE_INFO запись в этой среде.Стартовые код обычно обрабатывает эту запись и затем удаляет его из среды.Однако если набор узлов a _spawn функция икрит процесс non-C эта запись остается в этой среде.Указывает графические символы ввести среду в строке определения для данной записи поскольку данные передаются бинарную среды в форме в реальном режиме.Он не должен иметь любой другой влияние на обычных операциях.В защищенном режиме сведения о среде передаются в форме текста и поэтому не содержат символы графики.
Необходимо явно сбросить (using fflush OR _flushallлюбой поток) или закрыть перед вызовом a _spawn функция.
Новые процессы, созданные вызовах _spawn подпрограммы не сохраняют параметры ввода.Вместо этого икренные параметры процесса ввода возвратов в значение по умолчанию.
Записи выходных данных
Если вызвать _spawn из библиотеки DLL или приложения графического интерфейса пользователя и записи выходных данных в канал, имеющих значение 2 параметра:
Использовать API Win32, чтобы создать канал, вызовите AllocConsoleзадайте значения дескриптора в структуре запуска и вызов CreateProcess.
Вызов _popen, _wpopen чтобы создать приложение, используя канал и вызовите cmd.exe /c (или command.exe /c).
Пример
// crt_spawn.c
// This program accepts a number in the range
// 1-8 from the command line. Based on the number it receives,
// it executes one of the eight different procedures that
// spawn the process named child. For some of these procedures,
// the CHILD.EXE file must be in the same directory; for
// others, it only has to be in the same path.
//
#include <stdio.h>
#include <process.h>
char *my_env[] =
{
"THIS=environment will be",
"PASSED=to child.exe by the",
"_SPAWNLE=and",
"_SPAWNLPE=and",
"_SPAWNVE=and",
"_SPAWNVPE=functions",
NULL
};
int main( int argc, char *argv[] )
{
char *args[4];
// Set up parameters to be sent:
args[0] = "child";
args[1] = "spawn??";
args[2] = "two";
args[3] = NULL;
if (argc <= 2)
{
printf( "SYNTAX: SPAWN <1-8> <childprogram>\n" );
exit( 1 );
}
switch (argv[1][0]) // Based on first letter of argument
{
case '1':
_spawnl( _P_WAIT, argv[2], argv[2], "_spawnl", "two", NULL );
break;
case '2':
_spawnle( _P_WAIT, argv[2], argv[2], "_spawnle", "two",
NULL, my_env );
break;
case '3':
_spawnlp( _P_WAIT, argv[2], argv[2], "_spawnlp", "two", NULL );
break;
case '4':
_spawnlpe( _P_WAIT, argv[2], argv[2], "_spawnlpe", "two",
NULL, my_env );
break;
case '5':
_spawnv( _P_OVERLAY, argv[2], args );
break;
case '6':
_spawnve( _P_OVERLAY, argv[2], args, my_env );
break;
case '7':
_spawnvp( _P_OVERLAY, argv[2], args );
break;
case '8':
_spawnvpe( _P_OVERLAY, argv[2], args, my_env );
break;
default:
printf( "SYNTAX: SPAWN <1-8> <childprogram>\n" );
exit( 1 );
}
printf( "from SPAWN!\n" );
}