_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ę.
Letter | Wariant |
---|---|
e |
envp tablica 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 rutyna |
_UNICODE i _MBCS niezdefiniowane |
_MBCS zdefiniowany |
_UNICODE zdefiniowany |
---|---|---|---|
_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 .com rozszerzenie nazwy pliku, 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
, _spawnvp
i _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 _spawnl
systemach , _spawnle
, _spawnlp
i _spawnlpe
) lub jako tablicę wskaźników (w _spawnv
elementach , _spawnve
, _spawnvp
i _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
_spawnlp
i _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 argn
znaku musi istnieć NULL
wskaźnik, aby oznaczyć koniec listy argumentów.
Wywołania _spawnv
, , _spawnve
_spawnvp
i _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
, _spawnv
i _spawnvp
nowy proces dziedziczy środowisko procesu wywołującego. Wywołania , , i _spawnvpe
umożliwiają _spawnle
zmianę ś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:
Użyj interfejsu API Win32, aby utworzyć potok, a następnie wywołaj
AllocConsole
metodę , ustaw wartości uchwytu w strukturze uruchamiania i wywołaj metodęCreateProcess
.Wywołaj metodę lub
_wpopen
, która utworzy potok i wywoła aplikację przy użyciu metodycmd.exe /c
(lubcommand.exe /c
)._popen
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