Forking a Process: Mengendalikan Detasmen dan Mesej Ralat
Dalam Go, process forking membolehkan anda mencipta proses anak yang berjalan secara berasingan daripadanya ibu bapa. Ini boleh berguna untuk pelbagai sebab, seperti pemprosesan latar belakang atau penciptaan perkhidmatan.
Kod yang anda sediakan mencipta proses kanak-kanak menggunakan os.StartProcess tetapi bergelut untuk melepaskan kanak-kanak itu daripada baris arahan, memastikan mereka sentiasa bersambung. Untuk menangani isu ini, anda cuba menyembunyikan tetingkap kanak-kanak menggunakan procAttr.Sys.HideWindow, tetapi menghadapi ralat yang berkaitan dengan penuding memori.
Ralat yang anda temui adalah disebabkan oleh menetapkan medan Sys pada struct ProcAttr dengan tidak betul. Dalam Go, os.StartProcess menjangkakan medan Sys daripada jenis yang sepadan dengan sistem pengendalian asas. Untuk Windows, jenis yang betul ialah syscall.SysProcAttr.
Untuk menyelesaikan ralat, ubah suai kod untuk menggunakan syscall.SysProcAttr dan bukannya os.SysProcAttr:
package main import ( "fmt" "os" "os/exec" "syscall" ) func start() { var procAttr syscall.SysProcAttr procAttr.Files = []*os.File{nil, nil, nil} cmd := exec.Command("c:\Path\to\program.exe") cmd.SysProcAttr = &procAttr if err := cmd.Start(); err != nil { fmt.Printf("%v", err) } } func main() { start() }
Dengan menggunakan syscall khusus taip untuk tetapan khusus sistem pengendalian, anda boleh mengelakkan ralat dan berjaya melepaskan kanak-kanak itu proses daripada baris arahan.
Atas ialah kandungan terperinci Cara Melepaskan Proses Kanak-Kanak dalam Go: Mengapa os.SysProcAttr ialah Alat yang Salah untuk Kerja?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!