Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Membunuh Proses Kanak-kanak dengan Amanah Apabila Proses Go Parent Keluar?

Bagaimana untuk Membunuh Proses Kanak-kanak dengan Amanah Apabila Proses Go Parent Keluar?

DDD
DDDasal
2024-11-27 02:09:10256semak imbas

How to Reliably Kill Child Processes When a Go Parent Process Exits?

Membunuh Executable Child dalam Proses Go

Apabila menjalankan berbilang thread dalam Go yang melaksanakan executable berasingan, memastikan penamatan proses anak ini apabila penamatan proses Go induk menjadi penting. Artikel ini menangani isu ini dengan meneroka kaedah yang tersedia untuk mencapai matlamat ini.

Kaedah 1: Kumpulan Proses

Satu pendekatan ialah memulakan proses anak dalam proses yang sama kumpulan sebagai proses Go induk. Dengan berbuat demikian, apabila proses induk menerima isyarat bunuh (cth., SIGKILL atau SIGINT), keseluruhan kumpulan proses, termasuk anak boleh laku, ditamatkan.

Kaedah 2: Atribut Pdeathsig

Atribut Pdeathsig dalam fungsi syscall.SetProcAttr membolehkan anda tentukan isyarat yang akan dihantar kepada proses anak apabila proses induknya ditamatkan. Dengan menetapkan atribut ini kepada isyarat penamatan (cth., syscall.SIGTERM), proses anak akan diberi isyarat untuk keluar apabila proses Go induk keluar.

Pengendalian Isyarat

Walaupun tidak dijamin berkesan dengan SIG_KILL, anda boleh mewujudkan pengendali isyarat untuk isyarat biasa seperti SIG_INT dan SIG_TERM. Dalam pengendali ini, anda boleh menamatkan proses anak secara manual menggunakan syscall.Kill atau cmd.Process.Kill.

Contoh Kod:

Sampel kod berikut menunjukkan penggunaan daripada Pdeathsig untuk memastikan penamatan proses kanak-kanak:

cmd := exec.Command("./long-process")
cmd.SysProcAttr = &syscall.SysProcAttr{
    Pdeathsig: syscall.SIGTERM,
}

Atas ialah kandungan terperinci Bagaimana untuk Membunuh Proses Kanak-kanak dengan Amanah Apabila Proses Go Parent Keluar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn