_spawn
, _wspawn
fungsi
_spawn
Masing-masing fungsi membuat dan menjalankan proses baru:
_spawnl
, _wspawnl
_spawnle
, _wspawnle
_spawnlp
, _wspawnlp
_spawnlpe
, _wspawnlpe
_spawnv
, _wspawnv
_spawnve
, _wspawnve
_spawnvp
, _wspawnvp
_spawnvpe
, _wspawnvpe
Huruf di akhir nama fungsi menentukan variasi.
Letter | Varian |
---|---|
e |
envp , array pointer ke pengaturan lingkungan, diteruskan ke proses baru. |
l |
Argumen baris perintah diteruskan satu per satu ke _spawn fungsi. Akhiran ini biasanya digunakan ketika beberapa parameter untuk 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 _spawn fungsi. Akhiran ini biasanya digunakan ketika beberapa parameter untuk proses baru adalah variabel. |
Keterangan
Fungsi _spawn
masing-masing membuat dan menjalankan proses baru. Mereka secara otomatis menangani argumen string multibyte-character yang sesuai, mengenali urutan karakter multibyte sesuai dengan halaman kode multibyte yang saat ini digunakan. Fungsi ini _wspawn
adalah versi karakter luas dari _spawn
fungsi; fungsi tersebut tidak menangani string karakter multibyte. Jika tidak, _wspawn
fungsi bertempur identik dengan rekan-rekan mereka _spawn
.
Pemetaan rutin teks generik
Tchar.h Rutin |
_UNICODE dan _MBCS tidak ditentukan |
_MBCS Didefinisikan |
_UNICODE Didefinisikan |
---|---|---|---|
_tspawnl |
_spawnl |
_spawnl |
_wspawnl |
_tspawnle |
_spawnle |
_spawnle |
_wspawnle |
_tspawnlp |
_spawnlp |
_spawnlp |
_wspawnlp |
_tspawnlpe |
_spawnlpe |
_spawnlpe |
_wspawnlpe |
_tspawnv |
_spawnv |
_spawnv |
_wspawnv |
_tspawnve |
_spawnve |
_spawnve |
_wspawnve |
_tspawnvp |
_spawnvp |
_spawnvp |
_wspawnvp |
_tspawnvpe |
_spawnvpe |
_spawnvpe |
_wspawnvpe |
Memori yang cukup harus tersedia untuk memuat dan menjalankan proses baru. Argumen mode
menentukan tindakan yang diambil oleh proses panggilan sebelum dan selama _spawn
. Nilai berikut untuk mode
didefinisikan dalam Process.h
:
Nilai | Deskripsi |
---|---|
_P_OVERLAY |
Melapisi proses panggilan dengan proses baru, menghancurkan proses panggilan (efek yang sama dengan _exec panggilan). |
_P_WAIT |
Menangguhkan utas panggilan hingga eksekusi proses baru selesai (sinkron _spawn ). |
_P_NOWAIT atau _P_NOWAITO |
Terus menjalankan proses panggilan secara bersamaan dengan proses baru (asinkron _spawn ). |
_P_DETACH |
Terus menjalankan proses panggilan; proses baru dijalankan di latar belakang tanpa akses ke konsol atau keyboard. Panggilan ke _cwait terhadap proses baru gagal (asinkron _spawn ). |
Argumen cmdname
menentukan file yang dijalankan sebagai proses baru dan dapat menentukan jalur lengkap (dari akar), jalur parsial (dari direktori kerja saat ini), atau hanya nama file. Jika cmdname
tidak memiliki ekstensi nama file atau tidak diakhir dengan titik (.), _spawn
fungsi pertama-tama mencoba ekstensi nama file .com lalu ekstensi nama file .exe, ekstensi nama file .bat, dan akhirnya ekstensi nama file .cmd.
Jika cmdname
memiliki ekstensi nama file, hanya ekstensi yang digunakan. Jika cmdname
berakhir dengan titik, _spawn
panggilan akan dicari cmdname
tanpa ekstensi nama file. Fungsi _spawnlp
, , _spawnvp
_spawnlpe
, dan _spawnvpe
mencari cmdname
(menggunakan prosedur yang sama) dalam direktori yang ditentukan oleh PATH
variabel lingkungan.
Jika cmdname
berisi penentu drive atau garis miring apa pun (yaitu, jika itu adalah jalur relatif), _spawn
panggilan hanya mencari file yang ditentukan; tidak ada pencarian jalur yang dilakukan.
Di masa lalu, beberapa fungsi ini diatur errno
ke nol pada keberhasilan; perilaku saat ini adalah membiarkan errno
tidak tersentuh pada keberhasilan, seperti yang ditentukan oleh standar C. Jika Anda perlu meniru perilaku lama, atur errno
ke nol tepat sebelum memanggil fungsi-fungsi ini.
Catatan
Untuk memastikan inisialisasi dan penghentian overlay yang tepat, jangan gunakan setjmp
fungsi atau longjmp
untuk memasukkan atau meninggalkan rutinitas overlay.
Argumen untuk proses yang ditelurkan
Untuk meneruskan argumen ke proses baru, berikan satu atau beberapa penunjuk ke string karakter sebagai argumen dalam _spawn
panggilan. String karakter ini membentuk daftar argumen untuk proses yang ditelurkan. Panjang gabungan string yang membentuk daftar argumen untuk proses baru tidak boleh melebihi 1024 byte. Karakter null penghentian ('\0') untuk setiap string tidak disertakan dalam hitungan, tetapi karakter spasi (secara otomatis dimasukkan ke argumen terpisah) disertakan.
Catatan
Spasi yang disematkan dalam string dapat menyebabkan perilaku yang tidak terduga; misalnya, meneruskan _spawn
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 _spawn
tanpa memeriksa kontennya secara eksplisit. _spawn
akan mengakibatkan panggilan ke CreateProcess
jadi perlu diingat bahwa nama jalur yang tidak memenuhi syarat dapat menyebabkan potensi kerentanan keamanan.
Anda dapat meneruskan penunjuk argumen sebagai argumen terpisah (dalam _spawnl
, , _spawnle
_spawnlp
, dan _spawnlpe
) atau sebagai array pointer (dalam _spawnv
, _spawnve
, _spawnvp
, dan _spawnvpe
). Anda harus meneruskan setidaknya satu argumen, arg0
atau argv[0]
, ke proses yang ditelurkan. Menurut konvensi, argumen ini adalah nama program seperti yang akan Anda ketikkan pada baris perintah. Nilai yang berbeda tidak menghasilkan kesalahan.
_spawnl
Panggilan , _spawnle
, _spawnlp
, dan _spawnlpe
biasanya digunakan dalam kasus di mana jumlah argumen diketahui terlebih dahulu. Argumen arg0
biasanya penunjuk ke cmdname
. Argumen arg1
melalui argn
adalah penunjuk ke string karakter yang membentuk daftar argumen baru. Berikut argn
ini , harus ada penunjuk NULL
untuk menandai akhir daftar argumen.
_spawnv
Panggilan , _spawnve
, _spawnvp
, dan _spawnvpe
berguna ketika ada jumlah variabel argumen ke proses baru. Penunjuk ke argumen diteruskan sebagai array, argv
. Argumen argv[0]
biasanya adalah penunjuk ke jalur dalam mode nyata atau ke nama program dalam mode yang dilindungi, dan argv[1]
melalui argv[n]
adalah penunjuk ke string karakter yang membentuk daftar argumen baru. Argumen argv[n +1]
harus berupa NULL
penunjuk untuk menandai akhir daftar argumen.
Lingkungan Proses yang Ditelurkan
File yang terbuka ketika _spawn
panggilan dilakukan tetap terbuka dalam proses baru. _spawnl
Dalam panggilan , , _spawnv
_spawnlp
, dan _spawnvp
, proses baru mewarisi lingkungan proses panggilan. Anda dapat menggunakan _spawnle
panggilan , , _spawnve
_spawnlpe
, dan _spawnvpe
untuk mengubah lingkungan untuk proses baru dengan meneruskan daftar pengaturan lingkungan melalui envp
argumen . Argumen envp
adalah array penunjuk karakter, setiap elemen (kecuali elemen akhir) yang 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 yang ditelurkan mewarisi pengaturan lingkungan dari proses induk.
Fungsi dapat _spawn
meneruskan semua informasi tentang file terbuka, termasuk mode terjemahan, ke proses baru. Informasi ini diteruskan dalam mode nyata melalui C_FILE_INFO
entri di lingkungan. Kode startup biasanya memproses entri ini dan kemudian menghapusnya dari lingkungan. Namun, jika _spawn
fungsi menelurkan proses non-C, entri ini tetap berada di lingkungan. Mencetak lingkungan menunjukkan karakter grafis dalam string definisi untuk entri ini karena informasi lingkungan diteruskan dalam bentuk biner dalam mode nyata. Seharusnya tidak memiliki efek lain pada operasi normal. Dalam mode terproteksi, informasi lingkungan diteruskan dalam bentuk teks dan karenanya tidak berisi karakter grafis.
Anda harus secara eksplisit menghapus (menggunakan fflush
atau _flushall
) atau menutup aliran apa pun sebelum memanggil _spawn
fungsi.
Proses baru yang dibuat oleh panggilan ke _spawn
rutinitas tidak mempertahankan pengaturan sinyal. Sebagai gantinya, proses yang ditelurkan mengatur ulang pengaturan sinyal ke default.
Mengalihkan Output
Jika Anda memanggil _spawn
dari DLL atau aplikasi GUI dan ingin mengalihkan output ke pipa, Anda memiliki dua opsi:
Gunakan API Win32 untuk membuat pipa, lalu panggil
AllocConsole
, atur nilai handel dalam struktur startup, dan panggilCreateProcess
.Panggil
_popen
atau_wpopen
, yang akan membuat pipa dan memanggil aplikasi menggunakancmd.exe /c
(ataucommand.exe /c
).
Contoh
// crt_spawn.c
// This program accepts a number in the range
// 1-8 from the command line. Based on the number it receives,
// it executes one of the eight different procedures that
// spawn the process named child. For some of these procedures,
// the CHILD.EXE file must be in the same directory; for
// others, it only has to be in the same path.
//
#include <stdio.h>
#include <process.h>
char *my_env[] =
{
"THIS=environment will be",
"PASSED=to child.exe by the",
"_SPAWNLE=and",
"_SPAWNLPE=and",
"_SPAWNVE=and",
"_SPAWNVPE=functions",
NULL
};
int main( int argc, char *argv[] )
{
char *args[4];
// Set up parameters to be sent:
args[0] = "child";
args[1] = "spawn??";
args[2] = "two";
args[3] = NULL;
if (argc <= 2)
{
printf( "SYNTAX: SPAWN <1-8> <childprogram>\n" );
exit( 1 );
}
switch (argv[1][0]) // Based on first letter of argument
{
case '1':
_spawnl( _P_WAIT, argv[2], argv[2], "_spawnl", "two", NULL );
break;
case '2':
_spawnle( _P_WAIT, argv[2], argv[2], "_spawnle", "two",
NULL, my_env );
break;
case '3':
_spawnlp( _P_WAIT, argv[2], argv[2], "_spawnlp", "two", NULL );
break;
case '4':
_spawnlpe( _P_WAIT, argv[2], argv[2], "_spawnlpe", "two",
NULL, my_env );
break;
case '5':
_spawnv( _P_OVERLAY, argv[2], args );
break;
case '6':
_spawnve( _P_OVERLAY, argv[2], args, my_env );
break;
case '7':
_spawnvp( _P_OVERLAY, argv[2], args );
break;
case '8':
_spawnvpe( _P_OVERLAY, argv[2], args, my_env );
break;
default:
printf( "SYNTAX: SPAWN <1-8> <childprogram>\n" );
exit( 1 );
}
printf( "from SPAWN!\n" );
}
child process output
from SPAWN!
Lihat juga
Kontrol proses dan lingkungan
abort
atexit
_exec
, _wexec
fungsi
exit
, , _Exit
_exit
_flushall
_getmbcp
_onexit
, _onexit_m
_setmbcp
system
, _wsystem