Membunuh Proses Kanak-kanak dalam Go: Menyelesaikan Isu Tamat Masa
Dalam coretan kod Go yang disediakan, walaupun menetapkan tamat masa 2 saat dan cuba untuk menamatkan proses kanak-kanak dengan isyarat, proses itu berterusan dan "Selesai menunggu" kekal tidak dicetak. Tingkah laku ini menunjukkan bahawa proses kekal aktif melebihi masa yang diperuntukkan.
Punca isu ini terletak pada penggunaan cmd.Process.Signal() untuk menamatkan proses anak. Adalah penting untuk ambil perhatian bahawa fungsi ini hanya menghantar isyarat kepada proses utama, bukan anak-anaknya. Untuk menamatkan proses kanak-kanak dengan berkesan, adalah perlu untuk menyasarkan kumpulan proses yang mengandungi proses kanak-kanak, yang boleh dilakukan menggunakan pendekatan berikut:
// First, create the command and set up its attributes cmd := exec.Command( some_command ) cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} // Then, start the command cmd.Start() // Next, obtain the process group ID of the child process pgid, err := syscall.Getpgid(cmd.Process.Pid) if err == nil { // If the process group ID is successfully obtained, terminate it syscall.Kill(-pgid, 15) // note the minus sign } // Finally, wait for the command to complete cmd.Wait()
Dengan menetapkan Setpgid kepada benar dalam syscall.SysProcAttr, kami mengarahkan OS untuk mencipta kumpulan proses baharu untuk proses anak, memastikan isyarat yang dihantar kepada proses induk tidak menjejaskan proses anak. Tanda tolak masuk -pgid memastikan isyarat dihantar kepada semua ahli kumpulan proses, termasuk mana-mana proses anak.
Penyelesaian ini khusus platform dan mungkin tidak berfungsi pada semua sistem pengendalian. Walau bagaimanapun, ia telah dilaporkan berfungsi pada OSX Yosemite dan pelbagai pengedaran Linux, manakala keserasiannya pada Windows dan BSD kekal tidak pasti.
Atas ialah kandungan terperinci Bagaimana untuk Membunuh Proses Kanak-kanak dengan Amanah dalam Pergi Apabila Tamat Masa Berlaku?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!