Udostępnij za pośrednictwem


_spawn, _wspawn — Funkcje

Każdy z _spawn funkcje tworzy i uruchamia nowy proces:

_spawnl, _wspawnl

_spawnv, _wspawnv

_spawnle, _wspawnle

_spawnve, _wspawnve

_spawnlp, _wspawnlp

_spawnvp, _wspawnvp

_spawnlpe, _wspawnlpe

_spawnvpe, _wspawnvpe

Litery na końcu nazwy funkcji określa zmiany.

  • e
    envp, tablicy wskaźników do ustawień środowiska, jest przekazywany do nowego procesu.

  • l
    Argumenty wiersza polecenia są przekazywane indywidualnie do _spawn funkcji.Ten sufiks jest zwykle używany podczas wielu parametrów do nowego procesu jest znany z góry.

  • p
    PATHZmienna środowiskowa jest umożliwia znalezienie pliku do wykonania.

  • v
    argv, tablicy wskaźników do argumentów wiersza polecenia, jest przekazywany do _spawn funkcji.Ten sufiks jest zwykle używany podczas wielu parametrów do nowego procesu jest zmienna.

Uwagi

_spawn Funkcje każdego utworzyć i wykonać nowy proces.Automatycznie obsługują argumenty ciąg znaków wielobajtowych odpowiednio, uznając sekwencje znaków wielobajtowych według strona kodowa wielobajtowych obecnie w użyciu._wspawn Funkcje są szeroko charakter wersje _spawn funkcje; nie obsługują one ciągi znaków wielobajtowych.W przeciwnym razie _wspawn funkcje zachowują się identycznie ich _spawn odpowiedników.

Rutynowe mapowania zwykłego tekstu

Procedura Tchar.h

_UNICODE i _MBCS nie zdefiniowany

_MBCS zdefiniowano

_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

Za mało pamięci, muszą być dostępne do ładowania i wykonywania nowego procesu.mode Argument określa akcję podejmowaną 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 na powołanie proces z nowego procesu, niszcząc proces wywołujący (sam skutek, jak _exec wywołań).

  • _P_WAIT
    Wstrzymuje wywołania wątek, aż do zakończenia realizacji nowego procesu (synchroniczne _spawn).

  • _P_NOWAIT lub _P_NOWAITO
    Kontynuuje wykonywanie procesu wywołującego jednocześnie nowy proces (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ę niepowodzeniem (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ę (od bieżącego katalogu roboczego) lub po prostu nazwy pliku.Jeśli cmdname nie ma rozszerzenie nazwy pliku lub kończy się kropką (.), _spawn funkcja najpierw próbuje .com rozszerzenie nazwy pliku i następnie rozszerzenie nazwy pliku .exe, rozszerzenia nazwy pliku .bat i wreszcie rozszerzenie nazwy pliku .cmd.

Jeśli cmdname ma rozszerzenie nazwy pliku, tylko że rozszerzenie jest używany.Jeśli cmdname zakończoną kropką, _spawn wywołania wyszukuje cmdname z bez rozszerzenia nazwy pliku._spawnlp, _spawnlpe, _spawnvp, I _spawnvpe funkcji wyszukiwania cmdname (przy użyciu tych samych procedur) w katalogach, określone przez PATH zmiennej środowiskowej.

Jeśli cmdname zawiera żadnych kresek ułamkowych lub specyfikator dysk (jeśli jest ścieżką względną), _spawn wywołania wyszukuje tylko określony plik; nie ścieżki wyszukiwania jest wykonywana.

W przeszłości, niektóre z tych funkcji zestawu errno do zera w przypadku powodzenia; bieżące zachowanie jest zostawić errno niezmienione na sukces, jak określono w normie C.Jeśli zachodzi potrzeba emulować starsze zachowanie, zestaw errno do zera tuż przed wywołaniem tych funkcji.

[!UWAGA]

Nie należy używać w celu zapewnienia właściwego nakładki inicjowania i zakończenie, setjmp lub longjmp funkcji do wejścia lub wyjścia rutynowych nakładki.

Argumenty dla procesu zduplikowanego

Przekazywać argumenty do nowego procesu, dać jednej lub więcej wskazówek na ciągi znaków jako argumenty w _spawn zadzwonić.Te ciągi znaków tworzą listy argumentów dla procesu zduplikowanego.Łączna długość ciągów, tworząc listy argumentów nowy proces nie może przekraczać 1024 bajty.Kończącego znaku null (\0) dla każdego ciągu jest niedostępna w zliczaniu, ale znaki spacji (automatycznie wstawiane do oddzielenia argumentów) są uwzględniane.

[!UWAGA]

Spacje osadzone w ciągach znaków może spowodować nieoczekiwane zachowanie; na przykład przekazując _spawn ciąg "hi there" spowoduje powstanie nowego procesu pobierania dwa argumenty, "hi" i "there".Jeśli zamiarem było mieć nowy proces otwierania pliku o nazwie "Witam tam", proces może zakończyć się niepowodzeniem.Można tego uniknąć podając ciąg: "\"hi there\"".

Uwaga dotycząca zabezpieczeńUwaga dotycząca zabezpieczeń

Nie przechodzą do wprowadzania danych przez użytkownika _spawn bez jawnego sprawdzania jej zawartości._spawnspowoduje wywołanie CreateProcess tak należy pamiętać, że ścieżka niekwalifikowanych nazw może prowadzić do potencjalnych luk w zabezpieczeniach.

Wskaźniki argument można przekazać jako oddzielne argumenty (w _spawnl, _spawnle, _spawnlp, i _spawnlpe) lub jako tablica (w _spawnv, _spawnve, _spawnvp, i _spawnvpe).Należy przekazać przynajmniej jeden argument, arg0 lub argv[0] do procesu zduplikowanego.Umownie ten argument jest nazwę programu, należy go wpisać w wierszu polecenia.Inną wartość nie produkuje błąd.

_spawnl, _spawnle, _spawnlp, I _spawnlpe wywołania są zazwyczaj używane w przypadkach, gdzie liczba argumentów jest znany z góry.arg0 Argument jest zazwyczaj wskaźnikiem cmdname.Argumenty arg1 przez argn są wskaźnikami do ciągów znaków tworzących nowe listy argumentów.Następujący argn musi być wskaźnikiem NULL, aby zaznaczyć 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 zazwyczaj wskaźnikiem do ścieżki w trybie rzeczywistym lub nazwy programu w trybie chronionym i argv[1] przez argv[n] są wskaźnikami do ciągów znaków tworzących nowe listy argumentów.Argument argv[n + 1] musi być NULL wskaźnikiem, aby zaznaczyć koniec listy argumentów.

Środowiska procesu zduplikowanego

Pliki, które są otwarte przy _spawn wywołanie pozostają otwarte w nowym procesie.W _spawnl, _spawnlp, _spawnv, i _spawnvp wywołania, nowy proces dziedziczy środowisko procesu wywołującego.Można użyć _spawnle, _spawnlpe, _spawnve, i _spawnvpe wywołania do wpływu na środowisko, nowy proces przekazując listę ustawień środowiska poprzez envp argument.Argument envp jest tablica znaków, każdy element (z wyjątkiem ostatniego elementu), których punkty na ciąg zakończony znakiem null, określenie zmiennej środowiskowej.Taki ciąg zwykle ma postać NAME=value gdzie NAME jest nazwą zmiennej środowiskowej i value jest wartość ciągu, do którego ustawiono tej zmiennej. (Należy zauważyć, że value nie jest ujęty w podwójny cudzysłów.) Końcowy element envp Tablica powinna być NULL.Gdy envp sam w sobie jest NULL, proces dziedziczy ustawienia środowiska procesu nadrzędnego.

_spawn Funkcje można przekazać wszystkie informacje o otwartych plikach, w tym trybie tłumaczenia w nowy proces.Te informacje są przesyłane w trybie rzeczywistym poprzez C_FILE_INFO wpis w środowisku.Kod uruchamiający normalnie przetwarza ten wpis, a następnie usuwa ją ze środowiska.Jednakże jeśli _spawn funkcja ikra procesu-C, wpis ten 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 powinien on żadnego innego efektu na normalne operacje.W trybie chronionym informacje o środowisku jest przekazywana w formie tekstu i dlatego nie zawiera żadnych znaków graficznych.

Należy jawnie flush (za pomocą fflush lub _flushall) lub zamknąć każdy strumień przed wywołaniem funkcji _spawn funkcji.

Nowe procesy utworzone przez wywołania _spawn procedur nie zachowuje ustawienia sygnału.Zamiast tego procesu zduplikowanego przywraca domyślne ustawienia sygnału.

Przekierowanie danych wyjściowych

Jeśli wywoływany jest _spawn z biblioteki DLL lub aplikacji GUI i aby przekierować dane wyjściowe do potoku, masz dwie opcje:

  • Win32 API umożliwia tworzenie potoku, następnie wywołać AllocConsole, ustawienie wartości uchwyt w strukturę uruchamiania i wywołanie CreateProcess.

  • Wywołanie _popen, _wpopen który utworzy potok i wywoływać za pomocą 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" );
}
  

Zobacz też

Informacje

Procedury kontroli środowiska

przerwij

atexit

_exec, _wexec — Funkcje

exit, _exit

_flushall

_getmbcp

_onexit, _onexit_m

_setmbcp

system, _wsystem