_spawn, _wspawn функции

Каждая из функций _spawn создает и запускает новый процесс:

_spawnl, _wspawnl
_spawnle, _wspawnle
_spawnlp, _wspawnlp
_spawnlpe, _wspawnlpe
_spawnv, _wspawnv
_spawnve, _wspawnve
_spawnvp, _wspawnvp
_spawnvpe, _wspawnvpe

Буквы в конце имени функции определяют вариацию.

Письмо Вариант
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следующих значениях:

значение Description
_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. Аргументы arg1argn являются указателями на строки символов, которые образуют новый список аргументов. После 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