_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 _spawn
gerçekleştirilen eylemi belirler. için mode
aşağıdaki değerler içinde Process.h
tanı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
, _spawnlp
ve _spawnlpe
) veya işaretçi dizisi olarak ( _spawnv
, _spawnve
, _spawnvp
ve _spawnvpe
iç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
, _spawnlp
ve _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 cmdname
bir 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
, _spawnvp
ve _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 argv
olarak 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
, _spawnv
ve _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 _spawnle
listesini geçirerek yeni işlemin ortamını değiştirmek için , _spawnlpe
, _spawnve
ve _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 NAME
NAME
=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 _flushall
kullanarakfflush
) 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ı
AllocConsole
yapın, başlangıç yapısındaki tanıtıcı değerlerini ayarlayın ve öğesini çağırınCreateProcess
.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