_exec, _wexec İşlevleri
Bu ailesindeki her işlevi yükler ve yeni bir işlem yürütür:
İşlev adı sonunda harf değişimi belirler.
_exec işlevi soneki |
Açıklama |
---|---|
e |
envp, dizi ortam ayarlarına işaretçileri, yeni işlemin iletilir. |
l |
Komut satırı bağımsız değişkeni için ayrı ayrı geçirilir _exec işlev.Genellikle yeni işlem için parametre sayısı önceden bilinen olduğunda kullanılır. |
p |
PATHortam değişkeni yürütmek için dosyayı bulmak için kullanılır. |
v |
argv, dizi için komut satırı bağımsız değişkenleri için işaretçileri, geçirilen _exec.Genellikle yeni işlem için parametre sayısı değişken olduğunda kullanılır. |
Notlar
Her _exec işlev yükler ve yeni bir işlem yürütür.Tüm _exec işlevleri aynı işletim sistemi işlevini kullanın (CreateProcess)._exec İşlevleri şu anda kullanımda çoklu bayt kod sayfası göre çok baytlı karakter sıraları algılamayı baytlı karakter dizesi bağımsız değişken olarak uygun, otomatik olarak işler._wexec İşlevleri geniş karakter sürümü bulunmaktadır _exec işlevleri._wexec İşlevleri için aynı şekilde davranır kendi _exec ailesi karşılık gelen dışında çok baytlı karakter dizeleri işleyemez.
Genel Metin Yordam Eşleşmeleri
Tchar.h yordamı |
_UNICODE ve _MBCS tanımlanmaz |
_MBCS tanımlanmış |
_UNICODE tanımlanmış |
---|---|---|---|
_texecl |
_execl |
_execl |
_wexecl |
_texecle |
_execle |
_execle |
_wexecle |
_texeclp |
_execlp |
_execlp |
_wexeclp |
_texeclpe |
_execlpe |
_execlpe |
_wexeclpe |
_texecv |
_execv |
_execv |
_wexecv |
_texecve |
_execve |
_execve |
_wexecve |
_texecvp |
_execvp |
_execvp |
_wexecvp |
_texecvpe |
_execvpe |
_execvpe |
_wexecvpe |
cmdname Parametresi, yeni bir işlem olarak yürütülecek dosyasını belirtir.Bir tam yolu (kök), bir kısmi yolu (o anda çalışan dizinin) veya bir dosya adı belirtebilirsiniz.Varsa cmdname bir dosya adı uzantısına sahip değil veya nokta (.) ile bitmez _exec işlev adlandırılmış dosyası arar.Arama başarısız olursa, aynı temel adı .com dosya adı uzantısı ve ardından .exe, .bat ve .cmd dosya adı uzantıları ile çalışır.Varsa cmdname bir dosya adı uzantısına sahip yalnızca bir uzantı aramaya kullanılır.Varsa cmdname nokta ile biten _exec işlevi arar cmdname hiçbir dosya adı uzantısına sahip._execlp, _execlpe, _execvp, ve _execvpe aramak cmdname (aynı yordamları kullanarak) tarafından belirtilen dizinde PATH ortam değişkeni.Varsa cmdname (yani, göreli bir yol ise) sürücü belirticisi veya herhangi bir eğik çizgi içeriyor, _exec çağrısı belirtilen dosya; yalnızca arar yol aranır değil.
Parametreleri geçirilir yeni işlemi için parametre olarak karakter dizeleri için bir veya daha fazla işaretçileri vererek _exec çağırın.Bu karakter dizeleri yeni işlemi için parametre listesi oluşturur.Devralınan ortam ayarlarını ve yeni işlem için parametre listesi oluşturan dizeleri birleşik uzunluğu 32 kilobayt aşmamalıdır.Her bir dize sonlandırma null karakteri ('\0') sayıma dahil değildir, ancak boşluk karakterleri (parametreleri ayırmak için otomatik olarak eklenir) sayılır.
[!NOT]
Boşluk dizeler katıştırılmış beklenmeyen davranışlara neden olabilir; Örneğin, geçirmeden _exec dize "hi there" yeni iki bağımsız değişken alma işleminde sonuçlanacak "hi" ve "there".Yeni işlem adlı bir dosyayı açmak için hedefi olduysa "Merhaba var.", işlemi başarısız olur.Bu dize tırnak içine almak kaçının: "\"hi there\"".
Güvenlik Notu |
---|
Kullanıcı girişine geçmeyin _exec açıkça içeriğini denetlemeden._execbir çağrı sonuçlanır CreateProcess dolayısıyla adları için olası güvenlik açıklarına neden olabilir, nitelenmemiş yolunun unutmayın. |
_exec İşlevleri doğrula parametrelerini.Parametre null işaretçileri değildir bekleniyordu, boş dize veya çıkarılırsa, _exec işlevleri çağırmak geçersiz parametre işleyici açıklandığı gibi Parametre Doğrulama.Devam etmek için yürütme izin verilirse, bu işlevler kümesi errno için EINVAL ve -1 döndürür.Yeni bir işlem yürütülür.
Bağımsız değişken işaretçileri ayrı parametre olarak geçirilebilir (içinde _execl, _execle, _execlp, ve _execlpe) veya işaretçileri bir dizi olarak (içinde _execv, _execve, _execvp, ve _execvpe).En az bir parametre arg0, yeni işleme; geçirilen Bu parametre argv[0] yeni işleminin.Genellikle, bu parametre bir kopyasıdır cmdname.(Farklı bir değer, bir hata üretmez.)
_execl, _execle, _execlp, Ve _execlpe çağrıları genelde parametrelerin sayısı önceden bilinen olduğunda kullanılır.Parametre arg0 genellikle bir işaretçidir cmdname.Parametreleri arg1 üzerinden argn noktası yeni parametre listesi oluşturan karakter dizeleri için.Null bir işaretçi izlemeniz gereken argn parametre listesinin sonuna işaretlemek için.
_execv, _execve, _execvp, Ve _execvpe çağrıları yararlı ne zaman yeni işlemine parametrelerinin sayı değişkendir.İşaretçileri parametreleri için bir dizi olarak geçirilir argv.Parametre argv[0] genellikle bir işaretçidir cmdname.Parametreleri argv[1] üzerinden argv[n] noktası yeni parametre listesi oluşturan karakter dizeleri için.Parametre argv[n+ 1] olmalıdır bir NULL parametre listesinin sonuna işaretlemek için işaretçisi.
Açık dosyalar bir _exec araması yapılan yeni işlemde açık kalır.İçindeki _execl, _execlp, _execv, ve _execvp çağrıları, yeni işlem çağırma işleminin ortam devralır._execle, _execlpe, _execve, ve _execvpe çağrıları ortam ayarları üzerinden listesini geçirerek yeni işlemi için ortamı alter envp parametresi.envpsonlandırılmış bir dizeye (dışında son öğesi) her öğesinin işaret bir dizi karakter işaretçileri bir ortam değişkeni tanımlıyor.Bu tür bir dize genellikle form sahip NAME=value nerede NAME bir ortam değişkeni adı ve value bu değişken ayarlanır dize değeridir.(Dikkat edin value çift tırnak işaretleri arasına değil.) Son öğenin envp dizi olmalıdır NULL.Zaman envp kendisi NULL, yeni işlem çağırma işleminin ortam ayarlarını devralır.
Biri ile yürütülen bir program _exec 0xFFFFH için varsayılan değer olarak maksimum ayırma programın .exe dosyası üstbilgi alanında ayarlandıysa işlevleri belleğe her zaman yüklendi.
_exec Çağrıları açık dosyalar çeviri modlarını korumak değil.Yeni işlem çağıran işlemden devralınan dosyaları gerekir kullanırsanız _setmode bu dosyaların çeviri modu istenen moduna ayarlamak için yordam.Açıkça temizleme gerekir (kullanarak fflush veya _flushall) veya herhangi bir akış önce kapatın _exec işlev çağrısı.Sinyal ayarlarını yapılan çağrılar tarafından oluşturulan yeni işlemleri içinde değil korunur _exec yordamlarının.Sinyal ayarları, yeni işlem varsayılan sıfırlanır.
Örnek
// crt_args.c
// Illustrates the following variables used for accessing
// command-line arguments and environment variables:
// argc argv envp
// This program will be executed by crt_exec which follows.
#include <stdio.h>
int main( int argc, // Number of strings in array argv
char *argv[], // Array of command-line argument strings
char **envp ) // Array of environment variable strings
{
int count;
// Display each command-line argument.
printf( "\nCommand-line arguments:\n" );
for( count = 0; count < argc; count++ )
printf( " argv[%d] %s\n", count, argv[count] );
// Display each environment variable.
printf( "\nEnvironment variables:\n" );
while( *envp != NULL )
printf( " %s\n", *(envp++) );
return;
}
Crt_args.exe yürütmek için aşağıdaki programı çalıştırın:
// crt_exec.c
// Illustrates the different versions of exec, including
// _execl _execle _execlp _execlpe
// _execv _execve _execvp _execvpe
//
// Although CRT_EXEC.C can exec any program, you can verify how
// different versions handle arguments and environment by
// compiling and specifying the sample program CRT_ARGS.C. See
// "_spawn, _wspawn Functions" for examples of the similar spawn
// functions.
#include <stdio.h>
#include <conio.h>
#include <process.h>
char *my_env[] = // Environment for exec?e
{
"THIS=environment will be",
"PASSED=to new process by",
"the EXEC=functions",
NULL
};
int main( int ac, char* av[] )
{
char *args[4];
int ch;
if( ac != 3 ){
fprintf( stderr, "Usage: %s <program> <number (1-8)>\n", av[0] );
return;
}
// Arguments for _execv?
args[0] = av[1];
args[1] = "exec??";
args[2] = "two";
args[3] = NULL;
switch( atoi( av[2] ) )
{
case 1:
_execl( av[1], av[1], "_execl", "two", NULL );
break;
case 2:
_execle( av[1], av[1], "_execle", "two", NULL, my_env );
break;
case 3:
_execlp( av[1], av[1], "_execlp", "two", NULL );
break;
case 4:
_execlpe( av[1], av[1], "_execlpe", "two", NULL, my_env );
break;
case 5:
_execv( av[1], args );
break;
case 6:
_execve( av[1], args, my_env );
break;
case 7:
_execvp( av[1], args );
break;
case 8:
_execvpe( av[1], args, my_env );
break;
default:
break;
}
// This point is reached only if exec fails.
printf( "\nProcess was not execed." );
exit( 0 );
}
.NET Framework Eşdeğeri
Üstbilgi: process.h