Bagikan melalui


_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.

_spawnlPanggilan , _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 argnini , harus ada penunjuk NULL untuk menandai akhir daftar argumen.

_spawnvPanggilan , _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. _spawnlDalam panggilan , , _spawnv_spawnlp, dan _spawnvp , proses baru mewarisi lingkungan proses panggilan. Anda dapat menggunakan _spawnlepanggilan , , _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 panggil CreateProcess.

  • Panggil _popen atau _wpopen, yang akan membuat pipa dan memanggil aplikasi menggunakan cmd.exe /c (atau command.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