Aracılığıyla paylaş


_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 _execgeç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, _execvpve _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, _execlpve _execlpe) veya işaretçi dizisi olarak ( _execv, _execve, _execvpve _execvpeiç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, _execlpve _execlpe çağrıları genellikle parametre sayısı önceden bilindiğinde kullanılır. parametresi arg0 genellikle için cmdnamebir 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.

_execvYeni işlemin parametre sayısı değişken olduğunda , _execve, _execvpve _execvpe çağrıları yararlıdır. Parametrelerin işaretçileri bir dizi olarak geçirilir. argv parametresi argv[0] genellikle için cmdnamebir 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, _execvve _execvp çağrılarında_execl, yeni işlem çağrı işleminin ortamını devralır. _execle, _execlpe, _execveve _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 0xFFFFHayarlanmış 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 _flushallkullanarakfflush) 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