Udostępnij za pośrednictwem


_spawn, _wspawn funkcje

Każda z _spawn funkcji tworzy i wykonuje nowy proces:

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

Litery na końcu nazwy funkcji określają odmianę.

List Wariant
e envptablica wskaźników do ustawień środowiska jest przekazywana do nowego procesu.
l Argumenty wiersza polecenia są przekazywane indywidualnie do _spawn funkcji. Ten sufiks jest zwykle używany, gdy niektóre parametry do nowego procesu są znane z wyprzedzeniem.
p PATH zmienna środowiskowa służy do znajdowania pliku do wykonania.
v argv, tablica wskaźników do argumentów wiersza polecenia, jest przekazywana do _spawn funkcji. Ten sufiks jest zwykle używany, gdy kilka parametrów do nowego procesu jest zmienną.

Uwagi

Poszczególne _spawn funkcje tworzą i wykonują nowy proces. Automatycznie obsługują argumenty ciągu wielobajtowego zgodnie z potrzebami, rozpoznając sekwencje wielobajtowe znaków zgodnie ze stroną kodową wielobajtową, która jest obecnie używana. Funkcje _wspawn to wersje _spawn funkcji o szerokim znaku; nie obsługują ciągów wielobajtowych znaków. _wspawn W przeciwnym razie funkcje zachowują się identycznie z ich _spawn odpowiednikami.

Mapowania procedur tekstu ogólnego

Tchar.h Rutynowych _UNICODE i _MBCS niezdefiniowane _MBCS Zdefiniowane _UNICODE Zdefiniowane
_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

Wystarczająca ilość pamięci musi być dostępna do ładowania i wykonywania nowego procesu. mode Argument określa akcję podjętą przez proces wywołujący przed i podczas _spawn. Następujące wartości dla mode elementu są zdefiniowane w pliku Process.h:

Wartość Opis
_P_OVERLAY Nakłada proces wywołujący przy użyciu nowego procesu, niszcząc proces wywołujący (taki sam efekt jak _exec wywołania).
_P_WAIT Zawiesza wątek wywołujący do momentu ukończenia nowego procesu (synchronicznego _spawn).
_P_NOWAIT lub _P_NOWAITO Kontynuuje wykonywanie procesu wywołującego jednocześnie z nowym procesem (asynchronicznym _spawn).
_P_DETACH Kontynuuje wykonywanie procesu wywoływania; nowy proces jest uruchamiany w tle bez dostępu do konsoli ani klawiatury. Wywołania do nowego procesu kończą się _cwait niepowodzeniem (asynchroniczne _spawn).

cmdname Argument określa plik, który jest wykonywany jako nowy proces i może określić pełną ścieżkę (z katalogu głównego), ścieżkę częściową (z bieżącego katalogu roboczego) lub tylko nazwę pliku. Jeśli cmdname nie ma rozszerzenia nazwy pliku lub nie kończy się kropką (.), _spawn funkcja najpierw próbuje rozszerzenie nazwy pliku .com, a następnie rozszerzenie nazwy pliku exe, rozszerzenie nazwy pliku .bat, a na koniec rozszerzenie nazwy pliku cmd.

Jeśli cmdname ma rozszerzenie nazwy pliku, używane jest tylko to rozszerzenie. Jeśli cmdname kończy się kropką, _spawn wywołanie wyszukuje cmdname bez rozszerzenia nazwy pliku. Funkcje _spawnlp, _spawnlpe, _spawnvpi _spawnvpe wyszukują cmdname (przy użyciu tych samych procedur) w katalogach określonych przez zmienną środowiskową PATH .

Jeśli cmdname zawiera specyfikator dysku lub jakiekolwiek ukośniki (oznacza to, że jest to ścieżka względna), _spawn wywołanie wyszukuje tylko określony plik; żadne wyszukiwanie ścieżki nie jest wykonywane.

W przeszłości niektóre z tych funkcji mają wartość errno zero dla powodzenia. Bieżące zachowanie polega na pozostawieniu errno nietkniętego powodzenia zgodnie ze standardem C. Jeśli musisz emulować stare zachowanie, ustaw wartość errno zero tuż przed wywołaniem tych funkcji.

Uwaga

Aby zapewnić właściwą inicjację i zakończenie nakładki, nie należy używać setjmp funkcji or longjmp do wprowadzania lub pozostawiania procedury nakładki.

Argumenty dla procesu zduplikowanego

Aby przekazać argumenty do nowego procesu, należy podać co najmniej jeden wskaźnik do ciągów znaków jako argumenty w wywołaniu _spawn . Te ciągi znaków tworzą listę argumentów dla procesu zduplikowanego. Łączna długość ciągów tworzących listę argumentów dla nowego procesu nie może przekraczać 1024 bajtów. Znak null zakończenia ("\0") dla każdego ciągu nie jest uwzględniany w liczbie, ale uwzględniane są znaki spacji (automatycznie wstawione do oddzielnych argumentów).

Uwaga

Miejsca osadzone w ciągach mogą powodować nieoczekiwane zachowanie; na przykład przekazanie _spawn ciągu spowoduje, że nowy proces otrzyma dwa argumenty i "hi""there"."hi there" Jeśli intencją było otwarcie nowego procesu o nazwie "hi there", proces zakończy się niepowodzeniem. Można tego uniknąć, cytując ciąg: "\"hi there\"".

Ważne

Nie przekazuj danych wejściowych użytkownika do _spawn bez jawnego sprawdzania jego zawartości. _spawn spowoduje wywołanie CreateProcess metody , dlatego należy pamiętać, że niekwalifikowane nazwy ścieżek mogą prowadzić do potencjalnych luk w zabezpieczeniach.

Wskaźniki argumentów można przekazać jako oddzielne argumenty (w _spawnlsystemach , _spawnle, _spawnlpi _spawnlpe) lub jako tablicę wskaźników (w _spawnvelementach , _spawnve, _spawnvpi _spawnvpe). Musisz przekazać co najmniej jeden argument arg0 lub argv[0], do procesu zduplikowanego. Zgodnie z konwencją ten argument jest nazwą programu, ponieważ można go wpisać w wierszu polecenia. Inna wartość nie generuje błędu.

Wywołania _spawnl, , _spawnle_spawnlpi _spawnlpe są zwykle używane w przypadkach, gdy liczba argumentów jest znana z wyprzedzeniem. Argument arg0 jest zwykle wskaźnikiem do cmdname. Argumenty arg1 przez argn to wskaźniki do ciągów znaków tworzących nową listę argumentów. Po argnznaku musi istnieć NULL wskaźnik, aby oznaczyć koniec listy argumentów.

Wywołania _spawnv, , _spawnve_spawnvpi _spawnvpe są przydatne, gdy w nowym procesie istnieje zmienna liczba argumentów. Wskaźniki do argumentów są przekazywane jako tablica . argv Argument argv[0] jest zwykle wskaźnikiem do ścieżki w trybie rzeczywistym lub nazwy programu w trybie chronionym, a argv[1] przez argv[n] to wskaźniki do ciągów znaków tworzących nową listę argumentów. Argument argv[n +1] musi być wskaźnikiem NULL , aby oznaczyć koniec listy argumentów.

Środowisko procesu zduplikowanego

Pliki otwierane po _spawn wywołaniu pozostają otwarte w nowym procesie. W wywołaniach _spawnl, _spawnlp, _spawnvi _spawnvp nowy proces dziedziczy środowisko procesu wywołującego. Wywołania , , i _spawnvpe umożliwiają _spawnlezmianę środowiska dla nowego procesu, przekazując listę ustawień środowiska za pomocą argumentu envp_spawnve. _spawnlpe Argument envp jest tablicą wskaźników znaków, każdy element (z wyjątkiem końcowego elementu), z którego wskazuje ciąg zakończony wartości null definiujący zmienną środowiskową. Taki ciąg zwykle ma postać NAME=value , w której NAME jest nazwą zmiennej środowiskowej i value jest wartością ciągu, do której jest ustawiona ta zmienna. (Element value nie jest ujęta w znaki podwójnego cudzysłowu). Ostatnim elementem envp tablicy powinien być NULL. Gdy envp sam element to NULL, proces zduplikowany dziedziczy ustawienia środowiska procesu nadrzędnego.

Funkcje _spawn mogą przekazywać wszystkie informacje o otwartych plikach, w tym tryb tłumaczenia, do nowego procesu. Te informacje są przekazywane w trybie rzeczywistym za pośrednictwem C_FILE_INFO wpisu w środowisku. Kod uruchamiania zwykle przetwarza ten wpis, a następnie usuwa go ze środowiska. _spawn Jeśli jednak funkcja zduplikuje proces inny niż C, ten wpis pozostaje w środowisku. Drukowanie środowiska pokazuje znaki graficzne w ciągu definicji dla tego wpisu, ponieważ informacje o środowisku są przekazywane w postaci binarnej w trybie rzeczywistym. Nie powinien mieć żadnego innego wpływu na normalne operacje. W trybie chronionym informacje o środowisku są przekazywane w postaci tekstowej i w związku z tym nie zawierają znaków graficznych.

Przed wywołaniem _spawn funkcji należy jawnie opróżnić (przy użyciu fflush lub _flushall) lub zamknąć dowolny strumień.

Nowe procesy tworzone przez wywołania _spawn procedur nie zachowują ustawień sygnału. Zamiast tego proces zduplikowany resetuje ustawienia sygnału do wartości domyślnej.

Przekierowywanie danych wyjściowych

Jeśli wywołujesz z _spawn biblioteki DLL lub aplikacji graficznego interfejsu użytkownika i chcesz przekierować dane wyjściowe do potoku, masz dwie opcje:

Przykład

// 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!

Zobacz też

Kontrola procesu i środowiska
abort
atexit
_exec, _wexec funkcje
exit, _Exit, _exit
_flushall
_getmbcp
_onexit, _onexit_m
_setmbcp
system, _wsystem