Share via


_exec, _wexec Fungsi

Setiap fungsi dalam keluarga ini memuat dan menjalankan proses baru:

Huruf di akhir nama fungsi menentukan variasi.

_exec akhiran fungsi Deskripsi
e envp, array pointer ke pengaturan lingkungan, diteruskan ke proses baru.
l Argumen baris perintah diteruskan satu per satu ke _exec fungsi. Biasanya digunakan ketika jumlah parameter ke proses baru diketahui terlebih dahulu.
p PATH variabel lingkungan digunakan untuk menemukan file yang akan dijalankan.
v argv, array pointer ke argumen baris perintah, diteruskan ke _exec. Biasanya digunakan ketika jumlah parameter ke proses baru adalah variabel.

Keterangan

Setiap _exec fungsi memuat dan menjalankan proses baru. Semua _exec fungsi menggunakan fungsi sistem operasi yang sama (CreateProcess). Fungsi _exec secara otomatis menangani argumen string multibyte-character yang sesuai, mengenali urutan karakter multibyte sesuai dengan halaman kode multibyte yang saat ini digunakan. Fungsi ini _wexec adalah versi karakter luas dari _exec fungsi. Fungsi ini _wexec bertingkah identik dengan rekan-rekan keluarga mereka _exec kecuali bahwa mereka tidak menangani string karakter multibyte.

Pemetaan rutin teks generik

Tchar.h Rutin _UNICODE dan _MBCS tidak ditentukan _MBCS Didefinisikan _UNICODE Didefinisikan
_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

Parameter cmdname menentukan file yang akan dijalankan sebagai proses baru. Ini dapat menentukan jalur lengkap (dari akar), jalur parsial (dari direktori kerja saat ini), atau nama file. Jika cmdname tidak memiliki ekstensi nama file atau tidak diakhir dengan titik (.), _exec fungsi mencari file bernama. Jika pencarian tidak berhasil, pencarian akan mencoba nama dasar yang sama dengan ekstensi nama file .com lalu dengan ekstensi nama file .exe, .bat, dan .cmd. Jika cmdname memiliki ekstensi nama file, hanya ekstensi yang digunakan dalam pencarian. Jika cmdname berakhir dengan titik, _exec fungsi akan mencari cmdname tanpa ekstensi nama file. _execlp, _execlpe, _execvp, dan _execvpe cari cmdname (menggunakan prosedur yang sama) di direktori yang ditentukan oleh PATH variabel lingkungan. Jika cmdname berisi penentu drive atau garis miring apa pun (yaitu, jika itu adalah jalur relatif), _exec panggilan hanya mencari file yang ditentukan; jalur tidak dicari.

Parameter diteruskan ke proses baru dengan memberikan satu atau beberapa penunjuk ke string karakter sebagai parameter dalam _exec panggilan. String karakter ini membentuk daftar parameter untuk proses baru. Panjang gabungan pengaturan lingkungan yang diwariskan dan string yang membentuk daftar parameter untuk proses baru tidak boleh melebihi 32 kilobyte. Karakter penghentian NULL (\0) untuk setiap string tidak disertakan dalam hitungan, tetapi karakter spasi (dimasukkan secara otomatis untuk memisahkan parameter) dihitung.

Catatan

Spasi yang disematkan dalam string dapat menyebabkan perilaku yang tidak terduga; misalnya, meneruskan _exec string "hi there" akan mengakibatkan proses baru mendapatkan dua argumen, "hi" dan "there". Jika niatnya adalah agar proses baru membuka file bernama "hai di sana", prosesnya akan gagal. Anda dapat menghindari hal ini dengan mengutip string: "\"hi there\"".

Penting

Jangan meneruskan input pengguna ke _exec tanpa memeriksa kontennya secara eksplisit. _exec akan mengakibatkan panggilan ke CreateProcess jadi perlu diingat bahwa nama jalur yang tidak memenuhi syarat dapat menyebabkan potensi kerentanan keamanan.

Fungsi memvalidasi _exec parameternya. Jika parameter yang diharapkan adalah penunjuk null, string kosong, atau dihilangkan, _exec fungsi memanggil handler parameter yang tidak valid seperti yang dijelaskan dalam Validasi parameter. Jika eksekusi diizinkan untuk melanjutkan, fungsi-fungsi ini diatur errno ke EINVAL dan mengembalikan -1. Tidak ada proses baru yang dijalankan.

Pointer argumen dapat diteruskan sebagai parameter terpisah (dalam _execl, , _execle_execlp, dan _execlpe) atau sebagai array pointer (dalam _execv, , _execve_execvp, dan _execvpe). Setidaknya satu parameter, arg0, harus diteruskan ke proses baru; parameter ini adalah argv[0] proses baru. Biasanya, parameter ini adalah salinan dari cmdname. (Nilai yang berbeda tidak menghasilkan kesalahan.)

_execlPanggilan , _execle, _execlp, dan _execlpe biasanya digunakan ketika jumlah parameter diketahui terlebih dahulu. Parameter arg0 biasanya merupakan penunjuk ke cmdname. Parameter arg1 melalui argn titik ke string karakter yang membentuk daftar parameter baru. Penunjuk null harus mengikuti argn untuk menandai akhir daftar parameter.

Panggilan _execv, _execve, _execvp, dan _execvpe berguna ketika jumlah parameter ke proses baru bervariasi. Penunjuk ke parameter diteruskan sebagai array, argv. Parameter argv[0] biasanya merupakan penunjuk ke cmdname. Parameter argv[1] melalui argv[n] titik ke string karakter yang membentuk daftar parameter baru. Parameter argv[n+1] harus berupa NULL penunjuk untuk menandai akhir daftar parameter.

File yang terbuka ketika _exec panggilan dilakukan tetap terbuka dalam proses baru. Dalam _execlpanggilan , _execlp, _execv, dan _execvp , proses baru mewarisi lingkungan proses panggilan. _execle, _execlpe, _execve, dan _execvpe panggilan mengubah lingkungan untuk proses baru dengan meneruskan daftar pengaturan lingkungan melalui envp parameter . envp adalah array penunjuk karakter, setiap elemen yang (kecuali untuk elemen akhir) menunjuk ke string null-terminated yang menentukan variabel lingkungan. String seperti itu biasanya memiliki bentuk NAME=value di mana NAME adalah nama variabel lingkungan dan value merupakan nilai string tempat variabel tersebut diatur. value(tidak diapit dalam tanda kutip ganda.) Elemen akhir array envp harus NULL. Ketika envp itu sendiri adalah NULL, proses baru mewarisi pengaturan lingkungan dari proses panggilan.

Program yang dijalankan dengan salah _exec satu fungsi selalu dimuat ke dalam memori seolah-olah bidang alokasi maksimum di header file .exe program diatur ke nilai 0xFFFFHdefault .

Panggilan _exec tidak mempertahankan mode terjemahan file terbuka. Jika proses baru harus menggunakan file yang diwariskan dari proses panggilan, gunakan _setmode rutinitas untuk mengatur mode terjemahan file-file ini ke mode yang diinginkan. Anda harus secara eksplisit menghapus (menggunakan fflush atau _flushall) atau menutup aliran apa pun sebelum _exec panggilan fungsi. Pengaturan sinyal tidak dipertahankan dalam proses baru yang dibuat oleh panggilan ke _exec rutinitas. Pengaturan sinyal diatur ulang ke default dalam proses baru.

Contoh

// 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;
}

Jalankan program berikut untuk menjalankan Crt_args.exe:

// 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 );
}

Persyaratan

Header:process.h

Baca juga

Kontrol proses dan lingkungan
abort
atexit
exit, _Exit, _exit
_onexit, _onexit_m
_spawn, _wspawn fungsi
system, _wsystem