Condividi tramite


_spawn, funzioni di _wspawn

Ognuno di _spawn le funzioni crea ed esegue un nuovo processo:

_spawnl, _wspawnl

_spawnv, _wspawnv

_spawnle, _wspawnle

_spawnve, _wspawnve

_spawnlp, _wspawnlp

_spawnvp, _wspawnvp

_spawnlpe, _wspawnlpe

_spawnvpe, _wspawnvpe

Le lettere alla fine del nome della funzione determinano la variazione.

  • e
    envp, la matrice di puntatori alle impostazioni di ambiente, viene passata al nuovo processo.

  • l
    Gli argomenti della riga di comando vengono passati singolarmente a _spawn funzione.Questo suffisso viene utilizzato in genere quando una serie di parametri a un nuovo processo è noto in anticipo.

  • p
    PATH la variabile di ambiente viene utilizzata per cercare il file da eseguire.

  • v
    argv, la matrice di puntatori agli argomenti della riga di comando, viene passata a _spawn funzione.Questo suffisso viene utilizzato in genere quando una serie di parametri a un nuovo processo è variabili.

Note

_spawn viene eseguito ogni crea ed esegue un nuovo processo.Vengono gestiti automaticamente i gli argomenti della stringa con caratteri multibyte in base alle proprie esigenze, riconoscere le sequenze di caratteri multibyte in base alla tabella codici multibyte in uso._wspawn le funzioni disponibili versioni a caratteri estesi di _spawn funzioni; non gestiscono le stringhe di caratteri multibyte.In caso contrario, _wspawn le funzioni si comportano in modo identico al loro _spawn controparti.

Mapping di routine a testo generico

routine di Tchar.h

_UNICODE e _MBCS non definiti

_MBCS definito

_UNICODE definito

_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

Una quantità sufficiente di memoria deve essere disponibile per il caricamento ed eseguire di nuovo processo.mode l'argomento determina le azioni eseguite dal processo chiamante prima e durante _spawn.I valori seguenti per mode essere definito in Process.h:

  • _P_OVERLAY
    Si sovrapponga a un processo di chiamata con un nuovo processo, distruggente il processo di chiamata (lo stesso effetto come _exec chiamate).

  • _P_WAIT
    Sospende un thread chiamante finché l'esecuzione del nuovo processo non sia completo (sincrono _spawn).

  • _P_NOWAIT o _P_NOWAITO
    Esegue un processo chiamante contemporaneamente al nuovo processo (asincrono _spawn).

  • _P_DETACH
    Continua a eseguire il processo chiamante, il nuovo processo viene eseguito in background senza accesso alla console o la tastiera.chiamate a _cwait nella mancanza di nuovo processo (asincrono _spawn).

cmdname l'argomento indica il file di cui viene eseguito come nuovo processo e può specificare un percorso completo (dalla radice), un percorso parziale (dalla cartella di lavoro corrente), o semplicemente un nome file.se cmdname non presenta un'estensione di file o non termina con un punto (.), _spawn l'esecuzione viene innanzitutto tentata l'estensione di file .com e quindi l'estensione di file exe, l'estensione di file bat e infine l'estensione di file con estensione cmd.

se cmdname estensione di file, solo tale estensione viene utilizzata.se cmdname terminare con un punto, _spawn ricerche di chiamata cmdname senza estensione di file._spawnlp, _spawnlpe, _spawnvpe_spawnvpe ricerca di funzioni cmdname utilizzando le stesse procedure) nelle directory specificate da PATH variabile di ambiente.

se cmdname contiene un identificatore di unità o tutte le barre (ovvero se è un percorso relativo), _spawn la chiamata viene cercato soltanto il file specificato; nessuna ricerca del percorso viene eseguita.

In passato, alcune di queste funzioni impostate errno a zero su esito positivo, il comportamento corrente è di passare errno non gestito su esito positivo, come specificato dallo standard c.Se si desidera emulare il comportamento precedente, impostare errno a zero prima di chiamare queste funzioni.

[!NOTA]

Per garantire l'inizializzazione sovrapposta corretta e la chiusura, non utilizzare setjmp o longjmp eseguire per immettere o uscire da una routine a più livelli.

argomenti per il processo generato

Per passare argomenti al nuovo processo, specificare uno o più puntatori alle stringhe di caratteri come argomenti in _spawn chiamata.Queste stringhe di caratteri costituiscono l'elenco di argomenti per il processo generato.La lunghezza combinato delle stringhe che compongono l'elenco di argomenti per il nuovo processo non deve superare i 1024 byte.Il carattere di terminazione null (" \ 0 ") per ogni stringa non è incluso nel conteggio, ma gli spazi (automaticamente inseriti gli argomenti separati) vengono inclusi.

[!NOTA]

Gli spazi incorporati nelle stringhe possono causare un comportamento imprevisto, ad esempio, passare _spawn la stringa "hi there" restituisce il nuovo processo ottenere due argomenti, "hi" e "there".Se lo scopo è necessario che il nuovo processo aprire un file denominato “hello ovvero„, il processo produrrà alcun esito.È possibile evitare questo citando la stringa: "\"hi there\"".

Nota sulla sicurezzaNota sulla sicurezza

Non passare l'input dell'utente _spawn senza controllare in modo esplicito il contenuto._spawn restituisce una chiamata a CreateProcess pertanto è importante ricordare che i nomi di percorso non qualificati possono creare vulnerabilità della sicurezza.

È possibile passare i puntatori dell'argomento come argomenti separati (in _spawnl, _spawnle, _spawnlpe _spawnlpe) o come matrice di puntatori (in _spawnv, _spawnve, _spawnvpe _spawnvpe).È necessario passare almeno un argomento, arg0 o argv[0], al processo generato.Per convenzione, in questo argomento è il nome del programma come lo specificare nella riga di comando.Un valore diverso non produce un errore.

_spawnl, _spawnle, _spawnlpe _spawnlpe le chiamate vengono in genere utilizzate nei casi in cui il numero di argomenti è noto in anticipo.arg0 l'argomento è in genere un puntatore a cmdname.gli argomenti arg1 in argn sono puntatori a stringhe di caratteri che costituiscono il nuovo elenco di argomenti.seguire argn, deve essere presente su NULL puntatore per contrassegnare la fine dell'elenco di argomenti.

_spawnv, _spawnve, _spawnvpe _spawnvpe le chiamate sono utili quando viene eseguito un numero variabile di argomenti al nuovo processo.Puntatori agli argomenti vengono passati come matrice, argv*.* l'argomento argv[0] è in genere un puntatore a un percorso in modalità attivo o il nome del programma in modalità protetta e argv[1] tramite argv[n] sono puntatori a stringhe di caratteri che costituiscono il nuovo elenco di argomenti.l'argomento argv[n +1) devono essere a NULL puntatore per contrassegnare la fine dell'elenco di argomenti.

Ambiente del processo generato

File aperti quando a _spawn la chiamata viene effettuata rimane aperta nel nuovo processo.in _spawnl, _spawnlp, _spawnve _spawnvp le chiamate, il nuovo processo eredita l'ambiente del processo chiamante.È possibile utilizzare _spawnle, _spawnlpe, _spawnvee _spawnvpe chiama per modificare l'ambiente per il nuovo processo passando un elenco delle impostazioni di ambiente con envp argomento.l'argomento envp è una matrice di puntatori di carattere, ogni elemento (ad eccezione l'elemento finale) di cui indica una stringa con terminazione null che definisce una variabile di ambiente.Tale stringa in genere presenta il formato NAME=value dove NAME è il nome di una variabile di ambiente o value è il valore stringa in cui la variabile è impostata su.Si noti che value non è racchiuso tra virgolette doppie.) L'elemento finale di envp la matrice deve essere NULL.quando envp costituisce NULL, il processo generato eredita le impostazioni di ambiente del processo padre.

_spawn le funzioni possono comunicare le informazioni sui file aperti, inclusa la modalità di traduzione, al nuovo processo.Queste informazioni vengono passate in modalità reale con C_FILE_INFO voce nell'ambiente.Il codice di avvio in genere elabora questa voce che viene eliminato dall'ambiente.Tuttavia, a _spawn la funzione genera un processo non-C-, questa voce rimane nell'ambiente.Stampa dell'ambiente indica i caratteri di grafica nella stringa di definizione per la voce in quanto le informazioni sull'ambiente vengono passate in formato binario in modalità reale.Non può contenere qualsiasi altro effetto sulle operazioni standard.In modalità protetta, le informazioni sull'ambiente vengono passate in forma di testo e pertanto non contengono caratteri di grafica.

È necessario specificare in modo esplicito arrossirti (tramite fflush o _flushall) o chiudere il flusso prima di chiamare un oggetto _spawn funzione.

Nuovi processi creati dalle chiamate a _spawn le routine non vengono mantenute le impostazioni del segnale.Al contrario, le impostazioni gestite generate del segnale di reimpostato sull'impostazione predefinita.

Reindirizzamento di output

Se si sta chiamando _spawn da una DLL o da un'applicazione GUI e che si desideri reindirizzare l'output alla pipe, si dispone di due opzioni:

  • Utilizzare l'API Win32 per creare una pipe, pertanto una chiamata AllocConsole, impostare i valori di handle nella struttura di avvio e nella chiamata CreateProcess.

  • chiamata _popen, _wpopen di cui viene creata la pipe e richiamare l'applicazione utilizzando cmd.exe /c o command.exe /c).

Esempio

// 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" );
}
  

Vedere anche

Riferimenti

Processo e controllo ambiente

abort

atexit

_exec, funzioni di _wexec

exit, _exit

_flushall

_getmbcp

_onexit, _onexit_m

_setmbcp

system, _wsystem