Este artículo se tradujo automáticamente. Para ver el artículo en inglés, active la casilla Inglés. Además, puede mostrar el texto en inglés en una ventana emergente si mueve el puntero del mouse sobre el texto.
Traducción
Inglés
Esta documentación está archivada y no tiene mantenimiento.

_spawn, funciones de _wspawn

Cada una de las funciones de _spawn crea y ejecuta un nuevo proceso:

Las letras del final del nombre de función determinan la variación.

e

envp, matriz de punteros a la configuración de entorno, se pasa al nuevo proceso.

l

los argumentos de la línea de comandos se pasan individualmente a la función de _spawn . Este sufijo se utiliza normalmente cuando varios parámetros a un nuevo proceso se conocen de antemano.

p

la variable de entornoPATH se utiliza para buscar el archivo para ejecutarse.

v

argv, matriz de punteros a los argumentos de la línea de comandos, se pasa a la función de _spawn . Este sufijo se utiliza normalmente cuando varios parámetros a un nuevo proceso son variables.

_spawn funciona cada crea y ejecuta un nuevo proceso. Controlan automáticamente argumentos de cadena de caracteres multibyte según corresponda, reconociendo secuencias de caracteres multibyte según la página de códigos multibyte actualmente en uso. Las funciones de _wspawn son versiones de caracteres anchos de las funciones de _spawn ; no controlan las cadenas de caracteres multibyte. Si no, las funciones de _wspawn se comportan de forma idéntica a sus homólogos de _spawn .

Asignaciones de la rutina de texto genérico

rutina de Tchar.h

_UNICODE y _MBCS no definido

_MBCS definido

_UNICODE definido

_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

Suficiente memoria debe estar disponible para cargar y ejecutar el nuevo proceso. El argumento de mode determina la acción realizada por el proceso de llamada antes y durante _spawn. Los siguientes valores para mode son definidas en Process.h:

_P_OVERLAY

Se superpone a un proceso de llamada con un nuevo proceso, destruyendo el proceso de llamada (el mismo efecto que las llamadas de _exec ).

_P_WAIT

Suspende un subproceso de llamada hasta que la ejecución del nuevo proceso se complete ( _spawnsincrónico).

_P_NOWAIT o _P_NOWAITO

Sigue ejecutando un proceso que llama simultáneamente al nuevo proceso ( _spawnasincrónico).

_P_DETACH

Sigue ejecutando el proceso de llamada; el nuevo proceso se ejecuta en segundo plano sin el acceso a la consola o el teclado. Las llamadas a _cwait con el nuevo proceso no ( _spawnasincrónico).

El argumento de cmdname especifica el archivo que se ejecuta mientras el nuevo proceso y puede especificar una ruta de acceso completa (raíz), una ruta parcial (del directorio de trabajo actual), o simplemente un nombre de archivo. Si cmdname no tiene una extensión de nombre de archivo ni la finaliza con un punto (.), la función de _spawn primero intenta la extensión de nombre de archivo .com y a continuación la extensión de nombre de archivo .exe, la extensión de nombre de archivo .bat, y finalmente la extensión de nombre de archivo .cmd.

si cmdname tiene una extensión de nombre de archivo, sólo se utiliza esa extensión. Si finaliza con un punto, las búsquedas de cmdname de llamada de _spawn para cmdname sin la extensión de nombre de archivo. _spawnlp , _spawnlpe, _spawnvp, y búsqueda de las funciones de_spawnvpe para cmdname (utilizando los mismos procedimientos) en los directorios especificados por la variable de entorno PATH .

Si cmdname contiene un especificador de unidad o las barras diagonales (es decir, si es una ruta de acceso relativa), la llamada de _spawn busca únicamente el archivo especificado; no existe la búsqueda de ruta finalizado.

En el pasado, algunos de ellos funcionan errno determinado a cero en correctamente; el comportamiento actual es dejar errno sin tocar en correctamente, especificado por el estándar de C. Si necesita emular el comportamiento antiguo, establezca errno a cero justo antes de llamar a estas funciones.

Nota Nota

Para garantizar la inicialización y la finalización adecuadas de baraja, no utilice la función de setjmp o de longjmp para escribir o para permitir una rutina de superposición.

Para pasar argumentos al nuevo proceso, dé uno o varios punteros a cadenas de caracteres como argumentos en la llamada de _spawn . estas cadenas de caracteres forman la lista de argumentos para el proceso generado. la longitud combinada de las cadenas que forman la lista de argumentos para el nuevo proceso no debe superar 1024 bytes. El carácter null de terminación (“\ 0 ") para cada cadena no se incluye en el recuento, pero los caracteres de espacio (automáticamente insertados para separar argumentos) se incluyen.

Nota Nota

Los espacios insertados en cadenas pueden causar un comportamiento inesperado; por ejemplo, pasar _spawn la cadena "hi there" provocará el nuevo proceso que obtiene dos argumentos, "hi" y "there". Si el intento sin tener el nuevo proceso abre un archivo denominado “hello there”, el proceso produciría un error. Puede evitarlo citando string: "\"hi there\"".

Nota de seguridad Nota sobre la seguridad

No pase los datos proporcionados por el usuario a _spawn sin comprobar explícitamente su contenido. _spawn dará lugar a una llamada a CreateProcess para que tenga presente que los nombres de ruta de acceso calificada podrían provocar vulnerabilidades de seguridad potenciales.

Puede pasar punteros de argumento como argumentos separados (en _spawnl, _spawnle, _spawnlp, y _spawnlpe) o como una matriz de punteros (en _spawnv, _spawnve, _spawnvp, y _spawnvpe). Debe pasar al menos un argumento, arg0 o argv[0], al proceso generado. Por convención, este argumento es el nombre del programa a medida que se escribe en la línea de comandos. Un valor diferente no genera un error.

_spawnl , _spawnle, _spawnlp, y las llamadas de _spawnlpe se utilizan normalmente en caso de que el número de argumentos se conoce de antemano. El argumento de arg0 suele ser un puntero a cmdname. Los argumentos arg1 con argn son punteros a cadenas de caracteres que forman la nueva lista de argumentos. Después de argn, debe haber puntero de NULL para marcar el final de la lista de argumentos.

_spawnv , _spawnve, _spawnvp, y las llamadas de _spawnvpe son útiles cuando hay un número variable de argumentos al nuevo proceso. Los punteros a los argumentos se pasan como matriz, argv. El argumento argv[0] suele ser un puntero a una ruta en modo real o el nombre del programa en modo protegido, y argv[1] con argv[n] es punteros a cadenas de caracteres que forman la nueva lista de argumentos. El argumento argv[n +1] debe ser un puntero de NULL para marcar el final de la lista de argumentos.

Los archivos que están abiertos cuando se realiza una llamada de _spawn permanecen abiertos en el nuevo proceso. En _spawnl, _spawnlp, _spawnv, y las llamadas de _spawnvp , el nuevo proceso hereda el entorno del proceso de llamada. Puede utilizar _spawnle, _spawnlpe, _spawnve, y las llamadas de _spawnvpe para modificar el entorno para el nuevo proceso pasando una lista de configuración de entorno mediante el argumento de envp . El argumento envp es una matriz de punteros de carácter, cada elemento (excepto el último elemento) cuyo señala una cadena terminada en null define una variable de entorno. Esta cadena es normalmente el formulario NAME=value donde es el nombre NAME de una variable de entorno y value es el valor de cadena al que se establece la variable. (Observe que value no están encerrados entre comillas). El último elemento de la matriz de envp debe ser NULL. Cuando envp propio es NULL, el proceso generado hereda la configuración del entorno de proceso primario.

Las funciones de _spawn pueden pasar toda la información sobre los archivos abiertos, incluido el de modalidad de traducción, el nuevo proceso. esta información se pasa en modo real con la entrada de C_FILE_INFO en el entorno. El código de inicio procesa normalmente esta entrada y la elimina del entorno. Sin embargo, si una función de _spawn generar un proceso no--C-, permanece esta entrada del entorno. Imprimir el entorno muestra los caracteres gráficos en la cadena de definición para esta entrada porque la información del entorno se pasa en formato binario en modo real. No debe tener ningún otro efecto en las operaciones normales. En modo protegido, información de entorno se pasa en forma de texto y por consiguiente no contiene ningún carácter gráfico.

Debe explícitamente vaciar (mediante fflush o _flushall) o cerrar cualquier secuencia antes de llamar a una función de _spawn .

Los nuevos procesos creados mediante llamadas a las rutinas de _spawn no mantienen los valores de la señal. En su lugar, los valores de la señal de reinicios del proceso generado en el valor predeterminado.

Si se llama a _spawn DLL o de una aplicación de GUI y desea redirigir el resultado a una canalización, tiene dos opciones:

  • Utilice la API Win32 para crear una canalización, la llamada AllocConsole, establezca los valores de identificador en la estructura de inicio, y la llamada CreateProcess.

  • Llame a _popen, _wpopen que crean una canalización e invocar la aplicación mediante cmd.exe /c (o 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" );
}
resultado del proceso secundario
además de SPAWN!
Mostrar: