_spawn, _wspawn işlevler

İşlevlerin _spawn her biri yeni bir işlem oluşturur ve yürütür:

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

İşlev adının sonundaki harfler varyasyonu belirler.

Letter Varyant
e envp, ortam ayarlarına yönelik işaretçi dizisi yeni işleme geçirilir.
l Komut satırı bağımsız değişkenleri tek tek işleve _spawn geçirilir. Bu sonek genellikle yeni bir işlemin bazı parametreleri önceden bilindiğinde kullanılır.
p PATH ortam değişkeni yürütülecek dosyayı bulmak için kullanılır.
v argv, komut satırı bağımsız değişkenlerine yönelik işaretçi dizisi işlevine _spawn geçirilir. Bu sonek genellikle yeni bir işlemin birkaç parametresi değişken olduğunda kullanılır.

Açıklamalar

İşlevlerin _spawn her birinde yeni bir işlem oluşturulur ve yürütülür. Çok baytlı dize bağımsız değişkenlerini uygun şekilde otomatik olarak işler ve kullanımda olan çok baytlı kod sayfasına göre çok baytlı karakter dizilerini algılar. _wspawn İşlevler, işlevlerin _spawn geniş karakterli sürümleridir; çok baytlı karakter dizelerini işlemez. Aksi takdirde, _wspawn işlevler karşılık gelenleriyle _spawn aynı şekilde davranır.

Genel metin yordamı eşlemeleri

Tchar.h olağan _UNICODE ve _MBCS tanımlanmadı _MBCS tanımlanan _UNICODE tanımlanan
_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

Yeni işlemi yüklemek ve yürütmek için yeterli bellek kullanılabilir olmalıdır. bağımsız değişkeni, mode çağrısı işlemi tarafından öncesinde ve sırasında _spawngerçekleştirilen eylemi belirler. için mode aşağıdaki değerler içinde Process.htanımlanır:

Value Açıklama
_P_OVERLAY Arama işlemini yeni bir işlemle katmanlayarak arama işlemini yok eder (çağrılarla _exec aynı etki).
_P_WAIT Yeni işlemin yürütülmesi tamamlanana kadar çağıran iş parçacığını askıya alır (zaman uyumlu _spawn).
_P_NOWAIT veya _P_NOWAITO Yeni işlemle (zaman uyumsuz _spawn) eşzamanlı olarak bir çağrı işlemi yürütmeye devam eder.
_P_DETACH Arama işlemini yürütmeye devam eder; yeni işlem, konsola veya klavyeye erişim olmadan arka planda çalıştırılır. Yeni işleme karşı çağrısı _cwait başarısız olur (zaman uyumsuz _spawn).

cmdname bağımsız değişkeni, yeni işlem olarak yürütülen dosyayı belirtir ve tam yol (kökten), kısmi yol (geçerli çalışma dizininden) veya yalnızca bir dosya adı belirtebilir. Dosya adı uzantısı yoksa cmdname veya nokta (.) _spawn ile bitmiyorsa işlev önce .com dosya adı uzantısını ve ardından .exe dosya adı uzantısını, .bat dosya adı uzantısını ve son olarak .cmd dosya adı uzantısını dener.

Dosya adı uzantısı varsa cmdname , yalnızca bu uzantı kullanılır. Bir nokta ile biterse cmdname , _spawn arama hiçbir dosya adı uzantısı ile arar cmdname . , , ve işlevleri, ortam değişkeni tarafından PATH belirtilen dizinlerde (aynı yordamları kullanarak) arar cmdname ._spawnvpe _spawnvp_spawnlpe_spawnlp

cmdname Bir sürücü tanımlayıcısı veya eğik çizgi (göreli bir yolsa) _spawn içeriyorsa, arama yalnızca belirtilen dosya için arama yapılır; yol araması yapılmaz.

Geçmişte, bu işlevlerden bazıları başarıda sıfır olarak ayarlanmıştır errno ; geçerli davranış, C standardı tarafından belirtildiği gibi başarıda dokunulmadan bırakmaktır errno . Eski davranışı öykünmeye ihtiyacınız varsa, bu işlevleri çağırmadan hemen önce sıfır olarak ayarlayın errno .

Not

Düzgün katman başlatma ve sonlandırma sağlamak için, yer paylaşım yordamı girmek veya bırakmak için veya longjmp işlevini kullanmayınsetjmp.

Oluşturulan işlem için bağımsız değişkenler

Bağımsız değişkenleri yeni işleme geçirmek için, karakter dizelerine çağrıda _spawn bağımsız değişken olarak bir veya daha fazla işaretçi verin. Bu karakter dizeleri, oluşturulan işlemin bağımsız değişken listesini oluşturur. Yeni işlem için bağımsız değişken listesini oluşturan dizelerin birleşik uzunluğu 1024 baytı aşmamalıdır. Her dize için sonlandırıcı null karakter ('\0') sayıya dahil değildir, ancak boşluk karakterleri (ayrı bağımsız değişkenlere otomatik olarak eklenir) eklenir.

Not

Dizelere eklenmiş boşluklar beklenmeyen davranışlara neden olabilir; örneğin, dizenin "hi there" geçirilmesi_spawn, yeni işlemin iki bağımsız değişken "hi" almasına neden olur ve "there". Amaç, yeni işlemin "merhaba" adlı bir dosyayı açmasını sağlamaksa, işlem başarısız olur. dizesini alıntılayarak bundan kaçınabilirsiniz: "\"hi there\"".

Önemli

İçeriğini açıkça denetlemeden kullanıcı girişini 'a _spawn geçirmeyin. _spawn çağrısına CreateProcess neden olur, bu nedenle nitelenmemiş yol adlarının olası güvenlik açıklarına yol açabileceğini unutmayın.

Bağımsız değişken işaretçilerini ayrı bağımsız değişkenler olarak ( _spawnl, _spawnle, _spawnlpve _spawnlpe) veya işaretçi dizisi olarak ( _spawnv, _spawnve, _spawnvpve _spawnvpeiçinde) geçirebilirsiniz. Oluşturulan işleme en az bir bağımsız değişken arg0 veya argv[0]geçirmelisiniz. Kural gereği, bu bağımsız değişken, komut satırına yazdığınız programın adıdır. Farklı bir değer hata üretmez.

_spawnl, _spawnle, _spawnlpve _spawnlpe çağrıları genellikle bağımsız değişken sayısının önceden bilindiği durumlarda kullanılır. arg0 Bağımsız değişken genellikle için cmdnamebir işaretçidir. aracılığıyla argn bağımsız değişkenler, yeni bağımsız arg1 değişken listesini oluşturan karakter dizelerinin işaretçileridir. ardından argn, bağımsız değişken listesinin sonunu işaretlemek için bir NULL işaretçi olmalıdır.

_spawnv, _spawnve, _spawnvpve _spawnvpe çağrıları, yeni işlemde değişken sayıda bağımsız değişken olduğunda kullanışlıdır. Bağımsız değişkenlerin işaretçileri dizisi argvolarak geçirilir. Bağımsız değişken argv[0] genellikle gerçek modda veya korumalı modda program adına yönelik bir işaretçidir ve argv[1] aracılığıyla argv[n] yeni bağımsız değişken listesini oluşturan karakter dizelerinin işaretçileridir. Bağımsız değişken, bağımsız değişken argv[n +1] listesinin sonunu işaretlemek için bir NULL işaretçi olmalıdır.

Oluşturulan İşlemin Ortamı

Çağrı yapıldığında _spawn açık olan dosyalar yeni işlemde açık kalır. _spawnl, _spawnlp, _spawnvve _spawnvp çağrılarında, yeni işlem çağrı işleminin ortamını devralır. Bağımsız değişken aracılığıyla ortam ayarlarının _spawnlelistesini geçirerek yeni işlemin ortamını değiştirmek için , _spawnlpe, _spawnveve _spawnvpe çağrılarını envp kullanabilirsiniz. Bağımsız değişken envp , her öğesi (son öğe hariç) bir karakter işaretçileri dizisidir ve ortam değişkenini tanımlayan null olarak sonlandırılan dizeye işaret eder. Böyle bir dize genellikle NAMENAME=value ortam değişkeninin adı ve value bu değişkenin ayarlandığı dize değeri şeklindedir. (çift value tırnak içine alınmaz.) Dizinin son öğesi envp olmalıdır NULL. Kendisi olduğunda envp NULL, oluşturulan işlem üst işlemin ortam ayarlarını devralır.

İşlevler _spawn , çeviri modu da dahil olmak üzere açık dosyalar hakkındaki tüm bilgileri yeni işleme geçirebilir. Bu bilgiler ortamdaki giriş aracılığıyla C_FILE_INFO gerçek modda geçirilir. Başlangıç kodu normalde bu girişi işler ve ardından ortamdan siler. Ancak, bir _spawn işlev C olmayan bir işlem oluşturursa, bu giriş ortamda kalır. Ortam bilgileri gerçek modda ikili biçimde geçirildiğinden, ortam yazdırılırken bu girdinin tanım dizesindeki grafik karakterleri gösterilir. Normal işlemler üzerinde başka bir etkisi olmamalıdır. Korumalı modda, ortam bilgileri metin biçiminde geçirilir ve bu nedenle grafik karakteri içermez.

bir işlevi çağırmadan önce açıkça temizlemeniz (veya _flushallkullanarakfflush) veya herhangi bir _spawn akışı kapatmanız gerekir.

Rutinlere yapılan çağrılar _spawn tarafından oluşturulan yeni işlemler sinyal ayarlarını korumaz. Bunun yerine, oluşturulan işlem sinyal ayarlarını varsayılana sıfırlar.

Çıktıyı Yeniden Yönlendirme

DLL veya GUI uygulamasından çağrı _spawn yapıyor ve çıkışı bir kanala yeniden yönlendirmek istiyorsanız iki seçeneğiniz vardır:

  • Win32 API'sini kullanarak bir kanal oluşturun, ardından çağrısı AllocConsoleyapın, başlangıç yapısındaki tanıtıcı değerlerini ayarlayın ve öğesini çağırın CreateProcess.

  • Bir kanal oluşturacak ve (veya) kullanarak uygulamayı çağıracak olan veya _wpopenöğesini çağırın_popen.cmd.exe /c command.exe /c

Örnek

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

Ayrıca bkz.

İşlem ve ortam denetimi
abort
atexit
_exec, _wexec işlevler
exit, _Exit, _exit
_flushall
_getmbcp
_onexit, _onexit_m
_setmbcp
system, _wsystem