_exec
, _wexec
İşlevler
Bu ailedeki her işlev yeni bir işlem yükler ve yürütür:
Varyasyonu işlev adının sonundaki harf belirler.
_exec işlev soneki |
Açıklama |
---|---|
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 _exec geçirilir. Genellikle yeni işleme yönelik parametre sayısı ö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 öğesine _exec geçirilir. Genellikle yeni işleme yönelik parametre sayısı değişken olduğunda kullanılır. |
Açıklamalar
Her _exec
işlev yeni bir işlem yükler ve yürütür. Tüm _exec
işlevler aynı işletim sistemi işlevini (CreateProcess
) kullanır. İşlevler _exec
, kullanımda olan çok baytlı kod sayfasına göre çok baytlı karakter dizilerini tanıyarak çok baytlı dize bağımsız değişkenlerini uygun şekilde otomatik olarak işler. _wexec
İşlevler, işlevlerin _exec
geniş karakterli sürümleridir. İşlevler, _wexec
çok baytlı karakter dizelerini _exec
işlememeleri dışında aile karşılıklarıyla aynı şekilde davranır.
Genel metin yordamı eşlemeleri
Tchar.h olağan |
_UNICODE ve _MBCS tanımlanmadı |
_MBCS tanımlanan |
_UNICODE tanımlanan |
---|---|---|---|
_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 işlem olarak yürütülecek dosyayı belirtir. Tam yol (kökten), kısmi yol (geçerli çalışma dizininden) veya bir dosya adı belirtebilir. Dosya adı uzantısı yoksa cmdname
veya nokta (.) ile bitmiyorsa işlev _exec
adlandırılmış dosyayı arar. Arama başarısız olursa, .com dosya adı uzantısıyla ve ardından .exe, .bat ve .cmd dosya adı uzantılarıyla aynı temel adı dener. Dosya adı uzantısı varsa cmdname
, aramada yalnızca bu uzantı kullanılır. Nokta ile biterse cmdname
işlev, _exec
dosya adı uzantısı olmadan öğesini cmdname
arar. _execlp
, _execlpe
, _execvp
ve _execvpe
ortam değişkeni tarafından PATH
belirtilen dizinlerde (aynı yordamları kullanarak) arayın cmdname
. cmdname
Bir sürücü tanımlayıcısı veya eğik çizgi (göreli bir yolsa) _exec
içeriyorsa, çağrı yalnızca belirtilen dosyayı arar; yol aranmıyor.
Parametreler, çağrıda parametre olarak _exec
karakter dizelerine bir veya daha fazla işaretçi verilerek yeni işleme geçirilir. Bu karakter dizeleri yeni işlemin parametre listesini oluşturur. Devralınan ortam ayarlarının ve yeni işlemin parametre listesini oluşturan dizelerin birleşik uzunluğu 32 kilobayt'ı aşmamalıdır. Her dize için sonlandırıcı NULL
karakter (\0
) sayıya dahil değildir, ancak boşluk karakterleri (parametreleri ayırmak için otomatik olarak eklenir) sayılır.
Not
Dizelere eklenmiş boşluklar beklenmeyen davranışlara neden olabilir; örneğin, dizenin "hi there"
geçirilmesi_exec
, 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 _exec
geçirmeyin. _exec
ç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.
_exec
İşlevler parametrelerini doğrular. Beklenen parametreler null işaretçiler, boş dizeler veya atlanmış parametrelerse, _exec
işlevler Parametre doğrulamasında açıklandığı gibi geçersiz parametre işleyicisini çağırır. Yürütmenin devam etmesi için izin verilirse, bu işlevler olarak EINVAL
ayarlanır errno
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ı parametreler olarak ( _execl
, _execle
, _execlp
ve _execlpe
) veya işaretçi dizisi olarak ( _execv
, _execve
, _execvp
ve _execvpe
içinde) geçirilebilir. En az bir parametre olan arg0
, yeni işleme geçirilmelidir; bu parametre argv[0]
yeni işlemindir. Bu parametre genellikle bir kopyasıdır cmdname
. (Farklı bir değer hata oluşturmaz.)
_execl
, _execle
, _execlp
ve _execlpe
çağrıları genellikle parametre sayısı önceden bilindiğinde kullanılır. parametresi arg0
genellikle için cmdname
bir işaretçidir. Yeni parametre arg1
argn
listesini oluşturan karakter dizelerine kadar olan parametreler. Parametre listesinin sonunu işaretlemek için null işaretçinin izlemesi argn
gerekir.
_execv
Yeni işlemin parametre sayısı değişken olduğunda , _execve
, _execvp
ve _execvpe
çağrıları yararlıdır. Parametrelerin işaretçileri bir dizi olarak geçirilir. argv
parametresi argv[0]
genellikle için cmdname
bir işaretçidir. Yeni parametre argv[1]
argv[n]
listesini oluşturan karakter dizelerine kadar olan parametreler. Parametre, parametre argv[n+1]
listesinin sonunu işaretlemek için bir NULL
işaretçi olmalıdır.
Bir _exec
çağrı yapıldığında açık olan dosyalar yeni işlemde açık kalır. , _execlp
, _execv
ve _execvp
çağrılarında_execl
, yeni işlem çağrı işleminin ortamını devralır. _execle
, _execlpe
, _execve
ve _execvpe
çağrıları parametresi aracılığıyla envp
ortam ayarlarının listesini geçirerek yeni işlemin ortamını değiştirir. envp
, her öğesi (son öğe hariç) bir ortam değişkeni tanımlayan null olarak sonlandırılan dizeye işaret eden karakter işaretçileri dizisidir. Böyle bir dize genellikle NAME=value
NAME
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
. kendi envp
olduğunda NULL
, yeni işlem çağrı işleminin ortam ayarlarını devralır.
İşlevlerden biriyle _exec
yürütülen bir program her zaman, programın .exe dosya üst bilgisindeki en büyük ayırma alanı varsayılan değerine 0xFFFFH
ayarlanmış gibi belleğe yüklenir.
Çağrılar _exec
açık dosyaların çeviri modlarını korumaz. Yeni işlemin çağrı işleminden devralınan dosyaları kullanması gerekiyorsa, bu dosyaların çeviri modunu istenen moda ayarlamak için yordamını kullanın _setmode
. İşlev çağrısından önce _exec
açıkça temizlemeniz (veya _flushall
kullanarakfflush
) veya herhangi bir akışı kapatmanız gerekir. Sinyal ayarları, rutinlere yapılan çağrılar _exec
tarafından oluşturulan yeni işlemlerde korunmaz. Sinyal ayarları yeni işlemde varsayılana 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 );
}
Gereksinimler
Üstbilgi: process.h
Ayrıca bkz.
İşlem ve ortam denetimi
abort
atexit
exit
, _Exit
, _exit
_onexit
, _onexit_m
_spawn
, _wspawn
işlevler
system
, _wsystem