Bagikan melalui


Pewarisan Handel Pipa

Server pipa mengontrol apakah handelnya dapat diwariskan dengan cara berikut:

  • FungsiCreatePipe menerima struktur SECURITY_ATTRIBUTES. Jika server pipa mengatur bInheritHandle anggota struktur ini ke TRUE, handel yang dibuat oleh CreatePipe dapat diwariskan.
  • Server pipa dapat menggunakan fungsiDuplicateHandle untuk mengubah pewarisan handel pipa. Server pipa dapat membuat duplikat yang tidak dapat diwariskan dari handel pipa yang dapat diwariskan atau duplikat yang dapat diwariskan dari handel pipa yang tidak dapat diwariskan.
  • Fungsi CreateProcess memungkinkan server pipa menentukan apakah proses turunan mewarisi semua atau tidak ada handel yang dapat diwariskan.

Ketika proses anak mewarisi handel pipa, sistem memungkinkan proses untuk mengakses pipa. Namun, proses induk harus mengkomunikasikan nilai handel ke proses anak. Proses induk biasanya melakukan ini dengan mengalihkan handel output standar ke proses turunan, seperti yang ditunjukkan pada langkah-langkah berikut:

  1. Panggil fungsiGetStdHandle untuk mendapatkan handel output standar saat ini; simpan handel ini sehingga Anda dapat memulihkan handel output standar asli setelah proses turunan dibuat.
  2. Panggil fungsisetStdHandleuntuk mengatur handel output standar ke handel tulis ke pipa. Sekarang proses induk dapat membuat proses turunan.
  3. Panggil fungsiCloseHandle untuk menutup handel tulis ke pipa. Setelah proses turunan mewarisi handel tulis, proses induk tidak lagi memerlukan salinannya.
  4. PanggilSetStdHandleuntuk memulihkan handel output standar asli.

Proses anak menggunakan fungsiGetStdHandle untuk mendapatkan handel output standarnya, yang sekarang menjadi handel ke ujung tulis pipa. Proses anak kemudian menggunakan fungsiWriteFile untuk mengirim outputnya ke pipa. Ketika anak telah selesai dengan pipa, itu harus menutup handel pipa dengan memanggil CloseHandle atau dengan mengakhiri, yang secara otomatis menutup handel.

Proses induk menggunakan fungsiReadFile untuk menerima input dari pipa. Data ditulis ke pipa anonim sebagai aliran byte. Ini berarti bahwa proses induk yang membaca dari pipa tidak dapat membedakan antara byte yang ditulis dalam operasi tulis terpisah, kecuali proses induk dan anak menggunakan protokol untuk menunjukkan di mana operasi tulis berakhir. Ketika semua handel tulis ke pipa ditutup, fungsi ReadFile mengembalikan nol. Penting bagi proses induk untuk menutup handelnya ke ujung tulis pipa sebelum memanggil ReadFile. Jika ini tidak dilakukan, operasi ReadFile tidak dapat mengembalikan nol karena proses induk memiliki handel terbuka ke ujung tulis pipa.

Prosedur untuk mengalihkan handel input standar mirip dengan yang untuk mengalihkan handel output standar, kecuali bahwa handel baca pipa digunakan sebagai handel input standar anak. Dalam hal ini, proses induk harus memastikan bahwa proses turunan tidak mewarisi handel tulis pipa. Jika ini tidak dilakukan, operasiReadFile yang dilakukan oleh proses anak tidak dapat mengembalikan nol karena proses anak memiliki handel terbuka ke ujung tulis pipa.

Untuk contoh program yang menggunakan pipa anonim untuk mengalihkan handel standar proses anak, lihat Membuat Proses Anak dengan Input dan Output yang Dialihkan.