_spawn
, _wspawn
функции
Каждая из функций _spawn
создает и запускает новый процесс:
_spawnl
, _wspawnl
_spawnle
, _wspawnle
_spawnlp
, _wspawnlp
_spawnlpe
, _wspawnlpe
_spawnv
, _wspawnv
_spawnve
, _wspawnve
_spawnvp
, _wspawnvp
_spawnvpe
, _wspawnvpe
Буквы в конце имени функции определяют вариацию.
Letter | Вариант |
---|---|
e |
envp , массив указателей на параметры среды, передается в новый процесс. |
l |
Аргументы командной строки передаются по отдельности в функцию _spawn . Этот суффикс обычно используется, когда некоторые параметры для нового процесса известны заранее. |
p |
Переменная среды PATH используется для поиска файла для выполнения. |
v |
argv , массив указателей на аргументы командной строки, передается в функцию _spawn . Этот суффикс обычно используется, когда несколько параметров для нового процесса являются переменными. |
Замечания
Каждая из функций _spawn
создает и выполняет новый процесс. Такие функции автоматически обрабатывают аргументы в виде многобайтовых строк требуемым образом, распознавая многобайтовые последовательности символов в соответствии с текущей многобайтовой кодовой страницей. Функции являются версиями функций с широкими символами_spawn
. Они _wspawn
не обрабатывают многобайтовые строки символов. В противном случае функции _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 |
Перекрывает вызывающий процесс новым процессом, уничтожая вызывающий процесс (тот же эффект, что и при вызовах функций _exec ). |
_P_WAIT |
Приостанавливает вызывающий поток до тех пор, пока не будет завершено выполнение нового процесса (синхронная функция _spawn ). |
_P_NOWAIT или _P_NOWAITO |
Продолжает выполнять вызывающий процесс параллельно с новым процессом (асинхронная функция _spawn ). |
_P_DETACH |
Продолжает выполнять вызывающий процесс; новый процесс выполняется в фоновом режиме без доступа к консоли или клавиатуре. Вызовы функции _cwait для нового процесса завершаются ошибкой (асинхронная функция _spawn ). |
Аргумент cmdname
определяет файл, который выполняется как новый процесс и может указывать полный путь (от корневого каталога), частичный путь (из текущего рабочего каталога) или просто имя файла. Если cmdname
расширение имени файла отсутствует или не заканчивается точкой (.), _spawn
функция сначала пытается использовать расширение имени файла .com, а затем расширение имени файла .exe, расширение имени файла .bat и, наконец, расширение имени файла .cmd.
Если параметр cmdname
имеет расширение имени файла, для поиска используется только это расширение. Если cmdname
заканчивается точкой, вызванная функция _spawn
выполняет поиск cmdname
без расширения имени файла. Функции _spawnlp
, _spawnlpe
, _spawnvp
и _spawnvpe
выполняют поиск cmdname
(используя те же процедуры) в каталогах, указанных в переменной среды PATH
.
Если cmdname
содержит описатель диска или косую черту (то есть, если это относительный путь), _spawn
вызов выполняет поиск только для указанного файла; поиск пути не выполняется.
Раньше некоторые из этих функций присваивали параметру errno
нулевое значение в случае успеха, теперь при успешном результате значение errno
остается неизменным, как указано в стандарте С. Если нужно эмулировать старое поведение, перед вызовом этих функций присвойте параметру errno
нулевое значение.
Примечание.
Чтобы обеспечить правильную инициализацию и прекращение перекрытия, не используйте функцию setjmp
или longjmp
для входа в подпрограмму перекрытия или выхода из нее.
Аргументы для разреженного процесса
Для передачи аргументов в новый процесс задайте один или нескольких указателей на символьные строки как аргументы вызова функции _spawn
. Эти символьные строки формируют список аргументов для порожденного процесса. Общая длина строк, формирующих список аргументов для нового процесса, не должна превышать 1024 байтов. Завершающий символ NULL ('\0') для каждой строки не включается в число, но пробелы (автоматически вставлены в отдельные аргументы).
Примечание.
Пробелы, встроенные в строки, могут вызывать непредвиденное поведение. Например, если передать в функцию _spawn
строку "hi there"
, это приведет к тому, что новый процесс получит два аргумента: "hi"
и "there"
. Если предполагалось, что новый процесс должен открыть файл с именем hi there, произойдет сбой процесса. Этого можно избежать, заключив строку в кавычки: "\"hi there\""
.
Внимание
Не передавайте данные, вводимые пользователем, в функцию _spawn
, не выбрав это содержимое явно. _spawn
приведет к вызову CreateProcess
, чтобы помнить, что неквалифицированные имена путей могут привести к потенциальным уязвимостям системы безопасности.
Указатели аргументов можно передавать как отдельные параметры (в функциях _spawnl
, _spawnle
, _spawnlp
и _spawnlpe
) или как массивы указателей (в функциях _spawnv
, _spawnve
, _spawnvp
и _spawnvpe
). Необходимо передать по крайней мере один аргумент arg0
или argv[0]
в нее. По правилам этот аргумент представляет собой имя программы в том виде, в котором оно бы вводилось в командную строку. Другое значение не создает ошибку.
Вызовы функций _spawnl
, _spawnle
, _spawnlp
и _spawnlpe
обычно используются, если число аргументов известно заранее. Аргумент arg0
обычно является указателем на параметр cmdname
. Аргументы arg1
– argn
являются указателями на строки символов, которые образуют новый список аргументов. После argn
должно следовать указатель NULL
, отмечающий конец списка аргументов.
_spawnve
_spawnvp
Вызовы _spawnv
и _spawnvpe
вызовы полезны при наличии переменного числа аргументов для нового процесса. Указатели на аргументы передаются в виде массива argv
. Аргумент argv[0]
обычно является указателем на путь в реальном режиме или имя программы в защищенном режиме, а argv[1]
также через argv[n]
указатели на строки символов, формируя новый список аргументов. Аргумент argv[n +1]
должен быть указателем NULL
, чтобы пометить конец списка аргументов.
Среда порожденного процесса
Файлы, открытые во время вызова функции _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
в среде. Обычно код запуска обрабатывает эту запись, а затем удаляет ее из среды. Если же функция _spawn
порождает процесс, отличный от C, эта запись сохраняется в среде. При печати среды в строке определения для этой записи отображаются графические символы, так как сведения о среде передаются в формате двоичных данных в режиме реального времени. Он не должен иметь никакого другого влияния на обычные операции. В защищенном режиме сведения о среде передаются в виде текста и поэтому не содержат графических символов.
Перед вызовом функции fflush
необходимо явно сбросить (используя ключевое слово _flushall
или _spawn
) или закрыть все потоки.
Новые процессы, созданные вызовами _spawn
подпрограмм, не сохраняют параметры сигнала. Вместо этого порожденный процесс сбрасывает параметры сигнала по умолчанию.
Перенаправление выходных данных
Если вы вызываете _spawn
библиотеку DLL или приложение ГРАФИЧЕСКОго интерфейса пользователя и хотите перенаправить выходные данные на канал, у вас есть два варианта:
Используйте 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" );
}
child process output
from SPAWN!
См. также
Управление процессами и средой
abort
atexit
_exec
, _wexec
функции
exit
, , _Exit
_exit
_flushall
_getmbcp
_onexit
, _onexit_m
_setmbcp
system
, _wsystem