_spawn, _wspawn funkcje
Każdy z _spawn funkcje tworzy i wykonuje nowego procesu:
Litery na końcu nazwy funkcji określić odchylenia.
e
envp, tablicy wskaźników do ustawienia środowiska, jest przekazywany do nowego procesu.l
Argumenty wiersza polecenia przekazywane są indywidualnie do _spawn funkcji.Ten sufiks jest zazwyczaj używany, gdy liczba parametrów do nowego procesu jest znane z wyprzedzeniem.p
PATHZmienna środowiskowa jest używany do znalezienia pliku do wykonania.v
argv, tablicy wskaźników do argumentów wiersza polecenia, jest przekazywany do _spawn funkcji.Ten sufiks jest zazwyczaj używany, gdy liczba parametrów do nowego procesu jest zmienna.
Uwagi
_spawn Funkcje każdego tworzyć i wykonywać nowy proces.Automatycznie obsługują argumenty łańcuch znaków wielobajtowych, odpowiednio, uznając sekwencje znaków wielobajtowych, zgodnie z obecnie używanej strony kodowej wielobajtowych._wspawn Funkcje są wersje szerokich znaków z _spawn funkcje; nie obsługują one ciągi znaków wielobajtowych.W przeciwnym razie _wspawn funkcji zachowują się identycznie do ich _spawn odpowiedników.
Tekst rodzajowy rutynowych mapowania
Procedura TCHAR.h |
_UNICODE i _MBCS nie zdefiniowane |
_MBCS, definicja |
_UNICODE, definicja |
---|---|---|---|
_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 |
Za mało pamięci, muszą być dostępne za ładowanie i wykonywanie nowego procesu.mode Argument określa działania podejmowane przez proces wywołujący przed i podczas _spawn.Następujące wartości dla mode są zdefiniowane w Process.h:
_P_OVERLAY
Nakładki w calling procesu z nowego procesu zniszczenie procesu wywołującego (sam wpływ jako _exec wywołania)._P_WAIT
Wstrzymuje wątek wywołujący, aż do zakończenia realizacji nowego procesu (synchroniczne _spawn)._P_NOWAITlub _P_NOWAITO
Kontynuuje wykonywanie procesu wywołującego równocześnie z nowego procesu (asynchroniczny _spawn)._P_DETACH
Kontynuuje wykonywanie procesu wywołującego; nowy proces jest uruchamiany w tle, bez dostępu do konsoli lub klawiatury.Wzywa do _cwait przeciwko nowy proces się nie powieść (asynchroniczny _spawn).
cmdname Argument określa plik, który jest wykonywany jako nowy proces i można określić pełną ścieżkę (z katalogu głównego), częściową ścieżkę (z bieżącego katalogu roboczego) lub nazwę pliku.Jeśli cmdname nie ma rozszerzenie nazwy pliku lub nie kończyć się kropką (.), _spawn funkcja najpierw próbuje rozszerzenie nazwy pliku .com i następnie rozszerzenie nazwy pliku .exe, rozszerzenie nazwy pliku .bat i wreszcie rozszerzenie nazwy pliku .cmd.
Jeśli cmdname ma rozszerzenie nazwy, tylko że rozszerzenie jest używany.Jeśli cmdname kończy się okres, _spawn wywołania wyszukiwania dla cmdname bez rozszerzenia nazwy pliku._spawnlp, _spawnlpe, _spawnvp, I _spawnvpe funkcji wyszukiwania cmdname (przy użyciu tych samych procedur) w katalogach, określonej przez PATH zmiennej środowiskowej.
Jeśli cmdname zawiera specyfikator dysku lub jakichkolwiek ukośniki (jeśli jest ścieżką względną), _spawn wywołania wyszukiwania tylko dla określonego pliku; nie ścieżki wyszukiwania jest wykonywane.
W przeszłości, niektóre z tych funkcji zestawu errno do zera w przypadku powodzenia; bieżące zachowanie jest pozostawienie errno niezmienione na sukces, jak określono w normie C.Jeśli potrzebujesz emulować starsze zachowanie, należy ustawić errno do zera tuż przed wywołaniem funkcji.
[!UWAGA]
Nie należy używać w celu zapewnienia właściwego nakładki inicjowania i zakończenie, setjmp lub longjmp funkcji wejścia lub wyjścia z rutynowych nakładki.
Argumenty dla procesu zduplikowanego
Przekazywać argumenty do nowego procesu, podać jeden lub więcej wskazówek ciągów znaków jako argumenty w _spawn wywołania.Tych ciągów znaków tworzą listy argumentów dla procesu zduplikowanego.Łączna długość ciągów, tworząc listy argumentów dla nowego procesu nie może przekraczać 1024 bajty.Kończącego znaku null (\0) dla każdego ciągu nie jest uwzględniane w zliczaniu, ale znaki spacji (automatycznie dodaje do oddzielenia argumentów) są uwzględniane.
[!UWAGA]
Spacje osadzone w ciągach znaków mogą powodować nieoczekiwane zachowanie; na przykład, przekazując _spawn ciąg "hi there" spowoduje nowy proces uzyskiwania dwa argumenty, "hi" i "there".Jeśli zamiarem było mieć nowy proces otwierania pliku o nazwie "hi tam", proces może się nie powieść.Można tego uniknąć, cytując ciąg: "\"hi there\"".
Uwaga dotycząca zabezpieczeń |
---|
Nie przekazywać dane wejściowe użytkownika do _spawn bez sprawdzania wyraźnie jej zawartości._spawnspowoduje wywołanie do CreateProcess tak należy pamiętać, że ścieżki niekwalifikowanych nazw może doprowadzić do potencjalnych luk w zabezpieczeniach. |
Argument wskaźniki można przekazać jako oddzielne argumenty (w _spawnl, _spawnle, _spawnlp, i _spawnlpe) lub w postaci tablicy wskaźników (w _spawnv, _spawnve, _spawnvp, i _spawnvpe).Należy przekazywać co najmniej jeden argument, arg0 lub argv[0] zduplikowanego procesu.Umownie ten argument jest nazwa programu, należy wpisać w wierszu polecenia.Różne wartości nie wytwarzają błąd.
_spawnl, _spawnle, _spawnlp, I _spawnlpe wywołania są zazwyczaj używane w przypadkach, gdy liczba argumentów jest znane z wyprzedzeniem.arg0 Argument jest zwykle wskaźnik do cmdname.Argumenty arg1 przez argn są wskaźnikami do łańcuchów znaków tworzących nowe listy argumentów.Po argn, musi być NULL wskaźnik, aby oznaczyć koniec listy argumentów.
_spawnv, _spawnve, _spawnvp, I _spawnvpe wywołania są przydatne, gdy istnieje zmienna liczba argumentów do nowego procesu.Wskaźniki do argumenty są przekazywane jako tablica, argv*.* Argument argv[0] jest zwykle wskaźnik do ścieżki w trybie rzeczywistym lub nazwę programu w trybie chronionym, i argv[1] poprzez argvn są wskaźnikami do łańcuchów znaków tworzących nowe listy argumentów.Argument argvn + 1] musi być NULL wskaźnik, aby oznaczyć koniec listy argumentów.
Środowisko procesu zduplikowanego
Otwórz pliki, które są, gdy _spawn wywołanie pozostają otwarte w nowy proces.W _spawnl, _spawnlp, _spawnv, i _spawnvp rozmowy, nowy proces dziedziczy środowisko procesu wywołującego.Można użyć _spawnle, _spawnlpe, _spawnve, i _spawnvpe wpływu na środowisko, dla nowego procesu przez listę ustawień środowiska poprzez przekazanie wywołania envp argument.Argument envp jest tablicą znaków wskaźników, każdy element (z wyjątkiem ostatniego elementu), którego wskazuje ciąg zakończony znakiem null, Definiowanie zmiennej środowiskowej.Taki ciąg ma zazwyczaj postać NAME=value gdzie NAME jest nazwą zmiennej środowiskowej i value jest wartość ciągu, do którego tego zmienna jest ustawiana.(Należy zauważyć, że value nie jest ujęty w znaki podwójnego cudzysłowu.) Ostatnim elementem envp tablicy powinny być NULL.Gdy envp sobie jest NULL, zduplikowanego procesu dziedziczy ustawienia środowiska procesu nadrzędnego.
_spawn Funkcje można przekazać wszystkie informacje o otwartych plikach, w tym tryb translacji, nowy proces.Informacje te są przekazywane w trybie rzeczywistym poprzez C_FILE_INFO wpis w środowisku.Kod startowy zwykle przetwarza ten wpis, a następnie usuwa go ze środowiska.Jednakże jeśli _spawn funkcja uruchamia proces-C, ten wpis pozostaje w środowisku.Drukowanie środowiska pokazuje znaków graficznych w ciąg definicji dla tego wpisu, ponieważ informacje o środowisku jest przekazywana w formie binarnej, w trybie rzeczywistym.Nie powinno to mieć innego efektu na normalne operacje.W trybie chronionym informacje o środowisku jest przekazywana w formie tekstu i dlatego nie zawiera żadnych znaków graficznych.
Musi być jawnie flush (za pomocą fflush lub _flushall) lub zamknąć strumieniem przed wywoływaniem _spawn funkcji.
Nowe procesy utworzone przez wywołania _spawn procedur nie zachowuje ustawienia sygnału.Zamiast tego procesu zduplikowanego resetuje ustawienia sygnału domyślne.
Przekierowywanie danych wyjściowych
W przypadku wywołania _spawn z biblioteki DLL lub aplikacji GUI i aby przekierować dane wyjściowe do potoku, masz dwie opcje:
Użyj interfejsu Win32 API, aby utworzyć potok, następnie wywołać AllocConsole, ustawiania wartości uchwytu w strukturze uruchamiania i wywołanie CreateProcess.
Wywołanie _popen, _wpopen który utworzy potok i wywołać przy użyciu aplikacji cmd.exe /c (lub command.exe /c).
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" );
}