_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.)
_execl
Panggilan , _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 _execl
panggilan , _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 0xFFFFH
default .
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
Lihat juga
Kontrol proses dan lingkungan
abort
atexit
exit
, , _Exit
_exit
_onexit
, _onexit_m
_spawn
, _wspawn
fungsi
system
, _wsystem